Я пытаюсь инициализировать статический объект без успеха. Цель состоит в том, чтобы автоматически зарегистрировать фабричный класс в репозитории (который является одноэлементным).
Я уже посмотрел на: Как принудительно инициализировать статический элемент?
В одном из комментариев говорится, что (есть также пример, которому я следовал):
Я прочитал это в стандарте C ++ (14.7.1): если только член шаблона класса или шаблон члена не был явно создан или явно специализирован, специализация члена создается неявно, когда на специализацию ссылаются в контекст, который требует, чтобы определение члена существовало; в частности, инициализация (и любые связанные побочные эффекты) элемента статических данных не происходит, если только сам элемент статических данных не используется таким образом, который требует определения элемента статических данных.
Итак, я пытаюсь сделать что-то подобное, но мне не удалось вызвать инициализацию объекта. Вот код Я не знаю, что мне не хватает. Это шаблон, который я использую.
namespace my_lib
{
template <typename T>
struct FactoryHelper
{
FactoryHelper ();
static FactoryHelper<T> _helper;
};
}
И это макрос, который пользователь библиотеки будет использовать для определения фабричного класса и одновременно регистрации объекта в репозитории:
#define CREATE_FACTORY(ClassName)\
namespace my_lib\
{\
class ClassName##Factory;\
template<> FactoryHelper<ClassName##Factory>::FactoryHelper () { std::cout << "object initialized!" << std::endl; }\
template<> FactoryHelper<ClassName##Factory> FactoryHelper<ClassName##Factory>::_helper;\
struct ClassName##Factory : public FactoryBase<ClassName> {\
...\
};\
}
Предыдущий код определен в заголовочном файле (Factory.h).
В файле .cpp (Example.cpp) у меня есть:
CREATE_FACTORY(UnitTestExample)
...
Когда я запускаю программу, я не вижу сообщения, которое конструктор печатает, когда она вызывается. Любая помощь приветствуется.
Заранее спасибо.