为派生类生成唯一ID

时间:2012-10-20 19:25:53

标签: c++ inheritance derived-class

我正在尝试编写一个基类和一组N个派生类,其中每个派生类都有自己唯一的标识符,这里是一个简单的“手动”实现:

struct Base {
    static int id_ = 0;
};

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

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

问题是,如果我想继续添加派生类,我必须计算已经存在的派生类的数量。

事情也变得更复杂,因为我想使用bitset来表示唯一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"
};

实现此目的的最佳方法是什么? (或类似的东西)

2 个答案:

答案 0 :(得分:1)

像一系列函数(模板)这样简单的东西,为每种类型生成并保留一个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&lt; YourType&gt; (); 它们是在运行时生成的,因此generateUniqueID();

没有问题

答案 1 :(得分: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();