【发布时间】:2012-03-03 20:43:08
【问题描述】:
我试图初始化一个静态对象但没有成功。目的是在存储库中自动注册一个工厂类(这是一个单例)。
我已经看过了:How to force a static member to be initialized?
其中一个 cmets 说(还有一个我遵循的示例):
我在 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)
...
当我执行程序时,我看不到构造函数在调用时打印的消息。任何帮助都非常受欢迎。
提前致谢。
【问题讨论】:
标签: c++ templates initialization static-members