C++ 使无序初始化statc有序

C++ 使无序初始化statc有序,c++,c++11,C++,C++11,下面的类使用CRTP尝试向std::vector添加类型,该vector具有确保初始化顺序的Schwarz计数器。根据3.6.2/2,成员h_u具有无序初始化。我如何更改它以确保它已命令初始化?我希望派生类只需正确继承类即可 #ifndef P_H_ #define P_H_ #include "PR.h" template <typename T> class P { class helper { public: helper() {

下面的类使用CRTP尝试向std::vector添加类型,该vector具有确保初始化顺序的Schwarz计数器。根据3.6.2/2,成员h_u具有无序初始化。我如何更改它以确保它已命令初始化?我希望派生类只需正确继承类即可

#ifndef P_H_
#define P_H_

#include "PR.h"

template <typename T>
class P
{
   class helper
   {
   public:
      helper()
      {
         PR.push_back(typeid(T));
      }
   };
   static helper h_;
};

template <typename T>
typename P<T>::helper P<T>::h_;

#endif
\ifndef P\u H_
#定义P_H_
#包括“公共卫生”
模板
P类
{
类助手
{
公众:
助手()
{
PR.push_back(typeid(T));
}
};
静态辅助h_3;;
};
模板
typename P::helper P::h;
#恩迪夫

这类问题的标准模式是使用生成器,而不是公开全局静态变量。(这是C++中的一个老问题)

因此,改变:

static helper h_ ;
致:

定义如下:

template <typename T>
typename P<T>::helper & P<T>::h_()
{
  static P<T>::helper value_ ;
  return value_ ;
}
模板
typename P::helper&P::h_()
{
静态P::helper值;
返回值;
}

因此,它将保证在使用前进行初始化。

您可以选择何时在第一次使用时使用构造来初始化h_u:@ruslo它是一个模板,因此是ok(这是ODR的一个例外)。事实上,[temp]/6“类模板的[…]静态数据成员应在隐式实例化的每个翻译单元中定义”@Graznarak,因此您需要在加载时访问
h
?你能提供一个例子吗?@DyP我试图在调用main()之前使用h_u强制代码(构造函数)运行。实际上,我甚至不想让继承类知道它。我明白了。使其初始化有序并使其成为模板的唯一方法是显式地专门化它,这可能会破坏模板的用途。因此,我建议使用所建议的习语,而不是Schwarz计数器。或者调用
helper
ctor中的Schwarz计数器(静态init在任何动态init之前)。
template <typename T>
typename P<T>::helper & P<T>::h_()
{
  static P<T>::helper value_ ;
  return value_ ;
}