簡體   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