导出自动计数器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;
为什么我需要这个计数器?好吧,我将它用作另一个数组的类型和索引。
我有两个问题:
- 这个
Type
不是constexpr
,但是这个东西好像是
- 我只有一行代码需要放入我整个库的源文件中
我知道有多少派生 class 有(用一个不可怕的宏)如果它可以帮助,但我不知道更好的东西。
即使这意味着添加 class 或其他任何内容,我也希望看到您的 suggestions/alternatives。如果您至少可以删除 int FooBase::Counter = 0;
行,那就太好了。
PS: 我没有任何C++限制,欢迎TS。
PSS:实际情况稍微复杂一些,使用CRTP,希望不会有问题。
原则上不可能将派生的 class 计数器作为编译时间常量。原因是编译器无法知道,在编译一个翻译单元时,其他翻译单元中有多少个派生 class,或者您将按什么顺序 link 它们。
更糟糕的是,您可能决定将一些包含派生的 classes 的目标文件放入您在 运行 时加载的动态库中。在那种情况下,派生的 classes 的总数可能会在程序的 运行 时间内发生变化 。 同样,编译器无法确定是否是这种情况。
所以简而言之,你所看到的并不是C++语言的具体缺点,而是分离编译模型的根本限制。这意味着,如果你想这样做,你需要编写一个外部工具来运行完整的源代码,以生成 constexpr
变量的初始化表达式。
现在我的图书馆的第一部分有两个最后的问题。第一个是如果没有 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;
为什么我需要这个计数器?好吧,我将它用作另一个数组的类型和索引。
我有两个问题:
- 这个
Type
不是constexpr
,但是这个东西好像是 - 我只有一行代码需要放入我整个库的源文件中
我知道有多少派生 class 有(用一个不可怕的宏)如果它可以帮助,但我不知道更好的东西。
即使这意味着添加 class 或其他任何内容,我也希望看到您的 suggestions/alternatives。如果您至少可以删除 int FooBase::Counter = 0;
行,那就太好了。
PS: 我没有任何C++限制,欢迎TS。
PSS:实际情况稍微复杂一些,使用CRTP,希望不会有问题。
原则上不可能将派生的 class 计数器作为编译时间常量。原因是编译器无法知道,在编译一个翻译单元时,其他翻译单元中有多少个派生 class,或者您将按什么顺序 link 它们。
更糟糕的是,您可能决定将一些包含派生的 classes 的目标文件放入您在 运行 时加载的动态库中。在那种情况下,派生的 classes 的总数可能会在程序的 运行 时间内发生变化 。 同样,编译器无法确定是否是这种情况。
所以简而言之,你所看到的并不是C++语言的具体缺点,而是分离编译模型的根本限制。这意味着,如果你想这样做,你需要编写一个外部工具来运行完整的源代码,以生成 constexpr
变量的初始化表达式。