我正在尝试编写一个基类和一组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"
};
实现此目的的最佳方法是什么? (或类似的东西)
答案 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();