如何为全局类型设置静态计数器?
我想要一个静态计数器,每次创建另一种类型,类时都会递增。这是我尝试过的:
template <typename Type>
class Sequential_ID_Dispenser
{public:
static inline int nextDispensed = 0;
static int getID() { return nextDispensed++; }
};
struct DummyTypeForComponentIDs {}; // So that the same type is passed to getID()
template <typename T>
struct Component {
static inline int componentTypeID = Sequential_ID_Dispenser<DummyTypeForComponentIDs>::getID();
};
// The reason I've made it inherit like this is so that any time I add a new Component type/struct it'll automatically get an ID for that type
struct Hat : Component<Hat> {};
struct Tie : Component<Tie> {};
int main()
{
int id = Hat::componentTypeID; // = 0
id = Tie::componentTypeID; // = 1
}
这有效。但是我希望可以选择从任何其他组件轻松继承,但它不会像这样工作,例如:
template <typename T>
struct Component {
static inline int componentTypeID = Sequential_ID_Dispenser<DummyTypeForComponentIDs>::getID();
};
struct Hat : Component<Hat> {};
struct Tie : Component<Tie> {};
struct BlueHat : Hat {};
int main()
{
int id = Hat::componentTypeID; // = 0
id = Tie::componentTypeID; // = 1
id = BlueHat::componentTypeID; // = 0, gets the same number as struct Hat : Component<Hat>{}
}
对此有什么好的解决方案吗?理想情况下,我想只定义任何新结构而不将参数传递给基本构造函数。我意识到我为此使用了 CRTP,这正是我为使其工作所做的工作,但必须有更简单的方法,对吗?
编辑:实际上我很惊讶解决方案并不容易,我想要的是为我在全局命名空间中创建的每个类获取新 ID,我猜是编译时或运行时。
回答
您不需要对类型的(运行时)计数器进行继承。
您甚至可以使用模板变量 (C++14):
std::size_t getId()
{
static std::size_t counter = 0;
return counter++;
}
template <typename T>
std::size_t Id = getId();
演示。