CRTP全球架构师

时间:2014-02-21 21:06:19

标签: c++ crtp

我想允许一个类从基础CRTP类继承,该类导致在main()开始之前创建并运行全局构造函数。我的想法是使用它在一些地图中注册一个类型,以便稍后查找。似乎这只有在我实际实例化Derived类的成员并使用Base类时才有效。

#include <iostream>

class Foo {
 public:
  Foo() { std::cout << "Foo" << std::endl; }
};

template <typename T>
class Bar {
 private:
  static Foo foo_;
};

class Test : public Bar<Test> {
};

int main() {
  return 0;
}

Test继承自Bar<Test>,它具有类型为Foo的静态成员变量。不幸的是,Foo的构造函数未被调用。我希望能够在类使用CRTP实例化模板时运行全局构造函数,而无需实际创建该类的实例。我也很乐意使用依赖于实现的解决方案。

2 个答案:

答案 0 :(得分:0)

除了SomeClass instance之外,翻译单元中没有办法拥有全局类实例。

使用模板和静态成员,您可能(或可能不会)在多个翻译单元中使用全局变量。

答案 1 :(得分:0)

如果使用静态字段声明一个类,它是否由模板驱动无关紧要 - 除非您创建此类的实例,否则不会实例化静态成员。请注意 - 静态成员实例化的时间非常棘手,特别是如果您涉及多个库。