c++静态成员初始化

C++ static member initialization

本文关键字:初始化 静态成员 c++      更新时间:2023-10-16

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

#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();