派生类/替代的自动计数器?

时间:2016-12-06 23:19:33

标签: c++ metaprogramming derived-class

现在我的库的第一部分有两个最后一个问题。第一个是没有黑客的C ++中不可能的东西(如果我想要constexpr版本),它是一个派生类计数器

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;

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

我有两个问题:

  • Type不是constexpr,但似乎not really possible
  • 我有唯一的代码行需要放入我的整个库的源文件中

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

即使这意味着添加课程或其他任何内容,我也希望看到您的建议/替代方案。如果你至少可以删除int FooBase::Counter = 0;行,那就太好了。

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

PSS:真实案例有点复杂并且使用CRTP,我希望它不会成为问题。

1 个答案:

答案 0 :(得分:0)

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

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

简而言之,您所看到的不是C ++语言的特定缺点,而是单独编译模型的基本限制。这意味着,如果您想这样做,您需要编写一个外部工具,对完整的源代码进行操作,以生成constexpr变量的初始化表达式。