3

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

#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
4

1 回答 1

0

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

所以改变:

static helper h_ ;

至:

static helper & h_() ;

并像这样定义它:

template <typename T>
typename P<T>::helper & P<T>::h_()
{
  static P<T>::helper value_ ;
  return value_ ;
}

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

于 2013-11-19T20:22:03.883 回答