如何创建一个Lazy C ++模板类来处理没有默认构造函数的类型?

时间:2013-07-13 18:18:41

标签: c++ templates initialization lazy-evaluation copy-constructor

删除此问题以支持以下内容;现在处理没有默认构造函数的类的答案:

How to abstract lazy initialization in C++?

简而言之,代码使用placement new / delete。有关详细信息,请参阅http://en.wikipedia.org/wiki/Placement_syntax

1 个答案:

答案 0 :(得分:3)

只需使用boost::optional<T>代替您的成员m_bInitializedm_value。可能您只能使用boost::optional<T>而不是template class Lazy ...

如果你真的想以自己的方式制作它 - 那么窃取来自boost::optional<T>的一些实施细节。

一个提示是这个提升类使用placement new

class Lazy {
public:
   bool is_init() const { return m_memberPtr != nullptr; }
   T& force() 
   { 
      if (!is_init()) 
        m_memberPtr = new (m_memberMemory) T(m_initializer());
      return *m_memberPtr;
   }
private:
  T* m_memberPtr;
  alignas(T) char m_memberMemory[sizeof(T)]; // s
};