自动计数器用于派生类 /替代方案
Automatic counter for derived class / Alternative?
现在,我在库的第一部分中有两个问题。第一个是没有黑客的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
变量的初始化器表达式。
相关文章:
- 运行同一解决方案的另一个项目的项目
- 为什么使用 "this" 指针调用派生成员函数?
- 具有奇怪重复模板模式的派生类中的成员变量已损坏
- Project Euler问题4的错误解决方案
- 在派生函数中指定void*参数
- 如何通过派生类函数更改基类中的向量
- 如何委托派生类使用其父构造函数?
- 如何使用单独文件中的派生类访问友元函数对象
- 派生类销毁的最佳实践是什么
- 如何使用基类指针引用派生类成员
- 派生类是否可以在抽象工厂设计模式中具有数据成员
- 使用基类指针创建对象时,缺少派生类析构函数
- 如何引用基类的派生类?
- 计算每个节点的树高,帮助我解释这个代码解决方案
- 存储模板类型以强制转换回派生<T>
- 需要从 istream 和 ostream 派生 iostream
- 自动计数器用于派生类 /替代方案
- 基类方法调用派生类方法,任何可能的解决方案
- 如何在Visual Studio 2013中找到解决方案中的派生类
- 派生自库中的std::exception:仅头文件解决方案是否适用于捕获异常