У меня есть коллекция рабочих классов, и мне нужно иметь возможность динамически создавать экземпляры этих классов с помощью одной фабрики. Причина этого заключается в том, что новые рабочие классы пишутся часто, и я бы предпочел не обновлять фабричный класс для каждого рабочего типа каждый раз, когда добавляю новый рабочий класс.
В настоящее время это работает следующим образом: у меня есть класс с именем WorkerImplementationList
со статическим методом:
template <typename T>
WorkerImplementationList::registerWorkerFactoryMethod<T>(const std::string&)
, который хранит указатель на T::newInstance
во внутренней структуре данных, которая будет получена фабрикой позже. В каждом из рабочих классов есть статический int с именем _dummyInstanceRegistrationVariable
. В каждом из файлов .cc рабочих классов у меня есть следующая строка (на примере FooWorker
):
int FooWorker::_dummyInstanceRegistrationVariable =
WorkerImplementationList::registerWorkerFactoryMethod<FooWorker>("FooWorker");
Я хотел бы, чтобы статическая переменная была инициализирована перед созданием любых экземпляров класса. Кажется, это работает нормально, когда рабочий класс компилируется в тот же двоичный файл, который содержит main()
. Однако, когда FooWorker
находится в библиотеке (скажем, libblahapp_workers.a
) и основной исполняемый файл связывает эту библиотеку, похоже, что _dummyInstanceRegistrationVariable
не инициализируется до тех пор, пока не начнется main()
(я предполагаю, что он инициализируется, когда первый экземпляр FooWorker
построено), что слишком поздно для моих целей.
Я также пытался создать объект WorkerImplementationRegisterer<T>
в глобальной области видимости, который регистрирует соответствующий тип работника при его создании, но здесь я снова сталкиваюсь с проблемами, когда рабочий класс находится в библиотеке, внешней по отношению к main()
; этот глобально ограниченный объект не создается до начала main()
.
Статическое связывание моих рабочих библиотек решит эту проблему? Есть ли более элегантное решение, которое мне не хватает? Буду очень признателен за любую помощь.