[英]C++ static member initialization
我想定义类并向宏注册。 也就是说,运行一些运行时代码来注册类型节点,以便以后可以遍历它们。
#define DUMMY_REG(name,strname) \
struct name { template <class Any> name(Any&&,int i = \
registerType()) {} name() {} \
static int registerType() { \
static int res = registerTypeInMap(strname,\
makeTypeNodeFunction< name >(strname));\
return res;\
}\
static int s_var = registerType();\
};
所以,基本上,我有静态的s_var,并对其进行初始化,我想为其副作用运行一些函数(该函数注册一个类型)。 但是,当然,我不允许内联初始化s_var。 我必须超越一堂课。 这是一个问题,因为我想嵌套这样的类型:
struct ClassHolder {
DUMMY_REG(TypeA,"Runtime_name_for_TypeA");
DUMMY_REG(TypeB,"Runtime_name_for_TypeB");
};
我不能在宏末尾写这个,因为它仍然在类范围内。 如何确保在执行main之前运行一些静态代码以定义和注册某种类型?
我要避免的主要事情是冗余重复,例如一个类声明和一个宏用于注册类型-这是冗余和愚蠢的。
这就是我暂时解决的方式(也许人们在评论中以这种方式暗示了我的想法)。 基本上,我将辅助类型与模板配合使用,该模板调用了异常的函数来获取int的副作用,然后,您需要使用该int以便实例化(可以被编译器忽略),因此我使用了该int作为构造函数中的默认参数。 不确定它将扩展的程度如何,希望这是跨平台的。
#define DUMMY_REG(name,strname) \
struct name { template <class Any> name(Any&&,int reg = Regger::s_sideEffect) {} \
TypeRegger<name> Regger; \
name() {} \
static int registerType() { \
static int res = registerTypeInMap(strname,\
makeTypeNodeFunction< name >(strname));\
return res;\
}\
};
template <class T>
struct TypeRegger {
static const int s_sideEffect;
};
template <class T>
const int TypeRegger<T>::s_sideEffect = T::registerType();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.