@semenyakinVS
Писатель кода и не только

Как выполнить действия до вызова функции main (header-only решение)?

Пытаюсь написать свою систему регистрации классов для С++. Это нужно чтобы автоматизировать полиморфную сериализацию в С++ (сохранять и загружать объекты через указатель на базовый класс).

Регистрация классов требует выполнения определённых действий до запуска функции main(). Это возможно сделать через вызов конструкторов глобальных переменных. Например, так:

Текущее решение
#define COMBINE1(X,Y,Z) X##Y
#define COMBINE(X,Y,Z) COMBINE1(X,Y,Z)

//-----------------------------------------------------------------------------
#define BEFORE_MAIN_START_DEFFERED_TASK_0_ARG(M_TaskID,\
      M_TaskType, M_Priority)\
class M_TaskID {\
public:\
   M_TaskID() {\
      sBeforeMainStart.addTask(\
         new M_TaskType(), M_Priority);\
   }\
} s##M_TaskID;

//-----------------------------------------------------------------------------
#define BEFORE_MAIN_START_DEFFERED_TASK_1_ARG(M_TaskID,\
         M_TaskType, M_Arg1, M_Priority)\
class M_TaskID {\
public:\
   M_TaskID() {\
      sBeforeMainStart.addTask(\
         new M_TaskType(M_Arg1), M_Priority);\
   }\
} s##M_TaskID;

//-----------------------------------------------------------------------------
#define BEFORE_MAIN_START_DEFFERED_TASK_2_ARG(M_TaskID,\
      M_TaskType, M_Arg1, M_Arg2, M_Priority)\
class M_TaskID {\
public:\
   M_TaskID() {\
      sBeforeMainStart.addTask(\
         new M_TaskType(M_Arg1, M_Arg2), M_Priority);\
   }\
} s##M_TaskID;

//-----------------------------------------------------------------------------
#define PERFORM_BEFORE_MAIN_START_DEFFERED_ACTIONS()\
      sBeforeMainStart.performTaskQueue();



Это работает если есть cpp-файл, что делает его неудобным при использовании в template-зависимом контексте.
В хедер по понятным причинам текущий код выносить нельзя. Используя static-переменные, в общем и целом, можно добиться кривого решения проблемы (как-то проверять дубли вызовов конструкторов для всех единиц компиляции), но не хочется... Возможно ли решить поставленную задачу каким-то более изящным путём?
  • Вопрос задан
  • 267 просмотров
Пригласить эксперта
Ответы на вопрос 1
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы