C ++静态成员初始化

时间:2015-08-23 07:38:08

标签: c++ macros

我想定义类并用宏注册它。也就是说,运行一些运行时代码来注册类型节点,以便以后可以遍历它们。

#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之前确保运行一些静态代码来定义和注册某种类型?

我想要避免的主要问题是多余的重复,比如一个类的声明和一个用于注册类型的宏 - 这是多余的和愚蠢的。

1 个答案:

答案 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();