繁体   English   中英

C ++静态成员初始化

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM