现在我的库的第一部分有两个最后一个问题。第一个是没有黑客的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,我希望它不会成为问题。答案 0 :(得分:0)
原则上,派生类计数器不可能是编译时常量。原因是编译器在编译一个翻译单元时,无法知道其他翻译单元中有多少派生类,或者您将链接它们的顺序。
更糟糕的是,您可能决定将包含派生类的一些目标文件放入您在运行时加载的动态库中。在这种情况下,派生类的总数可能会在程序运行期间发生。同样,编译器无法确定是否是这种情况。
简而言之,您所看到的不是C ++语言的特定缺点,而是单独编译模型的基本限制。这意味着,如果您想这样做,您需要编写一个外部工具,对完整的源代码进行操作,以生成constexpr
变量的初始化表达式。