我想定义类并用宏注册它。也就是说,运行一些运行时代码来注册类型节点,以便以后可以遍历它们。
#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之前确保运行一些静态代码来定义和注册某种类型?
我想要避免的主要问题是多余的重复,比如一个类的声明和一个用于注册类型的宏 - 这是多余的和愚蠢的。
答案 0 :(得分:0)
这就是我现在解决的问题(也许人们在评论中暗示这一点,我不确定)。基本上,我使用了一个带有模板的helper类型,该模板调用一个函数脱节来获取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();