自动计数器用于派生类 /替代方案

Automatic counter for derived class / Alternative?

本文关键字:方案 派生 计数器 用于      更新时间:2023-10-16

现在,我在库的第一部分中有两个问题。第一个是没有黑客的C 中不可能的(如果我想要Constexpr版本),它是派生的类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;

为什么我需要这个柜台?好吧,我将其用作一种类型和索引到另一个数组。

我有两个问题:

  • Type不是constexpr,但是这个东西似乎真的不可能
  • 我有唯一需要放入整个库的源文件
  • 的代码行

我可以知道有多少个派生的班级(有一个宏观不可怕的宏),如果有帮助,但我对某些东西没有任何了解。

即使是添加类别或其他任何东西,我也希望看到您的建议/替代方案。如果您至少可以删除int FooBase::Counter = 0;行,那将是不错的。

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

pss:真实情况有点复杂并使用CRTP,我希望这不会是问题。

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

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

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