导出自动计数器class/替代?

Automatic counter for derived class / Alternative?

现在我的图书馆的第一部分有两个最后的问题。第一个是如果没有 hack 在 C++ 中是不可能的(如果我想要 constexpr 版本),它是一个 derived class counter:

class FooBase {

  protected:
    static int  Counter;
};

class Foo : public FooBase {

  public:
    static const int  Type;
};

const int  Foo::Type = ++FooBase::Counter;

struct FooTest : public Foo {};

必须在源文件中:

int  FooBase::Counter = 0;

为什么我需要这个计数器?好吧,我将它用作另一个数组的类型和索引。

我有两个问题:

我知道有多少派生 class 有(用一个不可怕的宏)如果它可以帮助,但我不知道更好的东西。

即使这意味着添加 class 或其他任何内容,我也希望看到您的 suggestions/alternatives。如果您至少可以删除 int FooBase::Counter = 0; 行,那就太好了。

PS: 我没有任何C++限制,欢迎TS。

PSS:实际情况稍微复杂一些,使用CRTP,希望不会有问题。

原则上不可能将派生的 class 计数器作为编译时间常量。原因是编译器无法知道,在编译一个翻译单元时,其他翻译单元中有多少个派生 class,或者您将按什么顺序 link 它们。

更糟糕的是,您可能决定将一些包含派生的 classes 的目标文件放入您在 运行 时加载的动态库中。在那种情况下,派生的 classes 的总数可能会在程序的 运行 时间内发生变化 同样,编译器无法确定是否是这种情况。

所以简而言之,你所看到的并不是C++语言的具体缺点,而是分离编译模型的根本限制。这意味着,如果你想这样做,你需要编写一个外部工具来运行完整的源代码,以生成 constexpr 变量的初始化表达式。