我试图初始化一个静态对象,但没有成功.目的是在存储库(单例)中自动注册工厂类.
我已经看过了:如何强制静态成员被初始化?
其中一条评论说(我还有一个例子):
我在C++标准(14.7.1)中读到它:除非已经显式实例化或显式地专门化了类模板或成员模板的成员,否则当在上下文中引用特化时隐式实例化成员的特化.要求成员定义存在; 特别是,除非静态数据成员本身以需要静态数据成员的定义存在的方式使用,否则不会发生静态数据成员的初始化(以及任何相关的副作用).
所以我试图做类似的事情,但我没有设法强制对象初始化.这是代码.我不知道我错过了什么.这是我正在使用的模板.
namespace my_lib
{
template <typename T>
struct FactoryHelper
{
FactoryHelper ();
static FactoryHelper<T> _helper;
};
}
Run Code Online (Sandbox Code Playgroud)
这是库的用户用来定义工厂类的宏,同时在存储库中注册一个对象:
#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> {\
...\
};\
}
Run Code Online (Sandbox Code Playgroud)
前面的代码在头文件(Factory.h)中定义.
在.cpp文件(Example.cpp)中,我有:
CREATE_FACTORY(UnitTestExample)
...
Run Code Online (Sandbox Code Playgroud)
当我执行程序时,我无法看到构造函数在调用时打印的消息.任何帮助都非常受欢迎.
提前致谢.
我有一个包含二进制文件和一组依赖的静态库的项目。我正在尝试建立每个库所花费的时间而没有成功。
我曾尝试使用它AddPreAction()/AddPostAction()
来计算经过的时间,但是AddPreAction()
一旦库所依赖的所有源文件都已编译(即有意义),就会被调用。
有一个与此问题有关的帖子:
但是我宁愿寻找一种更优雅的解决方案,而不是覆盖一些环境变量,然后不得不解析输出以计算时间。
提前致谢。
我的问题如下.我有大量的静态const整数作为标识符.出于这个原因,我想知道是否有可能在编译时检查是否存在多个具有相同值的常量(某种静态断言...).
我不想使用枚举,因为这些常量是在不同的模块中定义的,我不希望有一个很长的枚举与所有这些(并且其中一些不相互关联).
这里有一个基本的例子:
// module: foo.h
const uint32_t ELEMENT_TYPE_FOO_X = 46;
const uint32_t ELEMENT_TYPE_FOO_Y = 51;
...
// module: boo.h
const uint32_t ELEMENT_TYPE_BOO_C = 21;
const uint32_t ELEMENT_TYPE_BOO_D = 51;
Run Code Online (Sandbox Code Playgroud)
错误:ELEMENT_TYPE_FOO_Y和ELEMENT_TYPE_BOO_D具有相同的值.
我根本不是专家,我想到的唯一能够检测到这个错误的是模板专业化.
template<uint32_t N>
struct element_traits {
};
template<ELEMENT_TYPE_FOO_X> {
enum { value = ELEMENT_TYPE_FOO };
};
Run Code Online (Sandbox Code Playgroud)
但它似乎是一个复杂的解决方案.我不知道是否有更优雅/更好的解决方案.到目前为止我还没有找到任何东西.
提前致谢.