2

基本クラスと、各派生クラスが独自の一意の識別子を持つ N 個の派生クラスのセットを作成しようとしています。ここでは、単純な「手動」実装を示します。

struct Base {
    static int id_ = 0;
};

struct Derived1 : public Base {
    static int id_ = 1;
};

struct Derived2 : public Base {
    static int id_ = 2;
};

問題は、派生クラスを追加し続けたい場合、既存の派生クラスの数を数えなければならないことです。

ビットセットを使用して一意の ID を表現したいので、事態はさらに複雑になります。すべての派生クラスの一意の ID が基本的に、1 に設定された (共通長ビットセットの) 異なるビットである場合、派生クラスのグループに対してバイナリ AND/OR/XOR/etc 操作を実行するのが非常に簡単になります。

以下は、私が望むものの不完全で間違った実装です

//Let DCOUNT be the number of derived classes, Ideally I shouldnt have to ever
//know/think about what it evaluates too, it should be automatic.
//But that is second priority, I would be willing to #define this to 
//some 'large' value, and not worry about it.
struct Base {
    static std::bitset<DCOUNT> id_ = generateUniqueID(); // "00000"
};

struct Derived1 {
    static std::bitset<DCOUNT> id_ = generateUniqueID(); // "00001"
};

struct Derived2 {
    static std::bitset<DCOUNT> id_ = generateUniqueID(); // "00010"
};

これを実装する最良の方法は何ですか? (またはそのようなもの)

4

2 に答える 2

3

次のように、各タイプの ID を生成して保持する一連の関数 (テンプレート) のような単純なものはどうでしょうか。

 template<typename T>
 static std::bitset<DCOUNT> getId()
 {
     static std::bitset<DCOUNT> bitset;
     static bool bitsetCreated = false;
     if ( false == bitsetCreated )
     {
        bitset = generateUniqueID();
        bitsetCreated = true;
     }
     return bitset;
 }

その後、次のように ID を取得できます。 getId < YourType > (); これらは実行時に生成されるため、generateUniqueID(); で問題はありません。

于 2012-10-20T19:57:21.743 に答える
0

これはRTTIです。

外部関数で静的メンバーを初期化することはできません。次のようなコンパイラ エラーが発生します。

'generateUniqueID()' cannot appear in a constant-expression

また

ISO C++ forbids in-class initialization of non-const static member ‘id_’

id_手で値を初期化することしかできないと思います。

クラスの型を知るための代替手段もあります。次のように、typeid関数を使用します。

if (typeid(myInstance) == typeid(Derived1))
    do_something();
于 2012-10-20T19:40:48.983 に答える