2

我正在尝试编写一个基类和一组 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"
};

实现这一点的最佳方法是什么?(或类似的东西)

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 回答