删除此问题以支持以下内容;现在处理没有默认构造函数的类的答案:
How to abstract lazy initialization in C++?
简而言之,代码使用placement new / delete。有关详细信息,请参阅http://en.wikipedia.org/wiki/Placement_syntax
答案 0 :(得分:3)
只需使用boost::optional<T>
代替您的成员m_bInitialized
和m_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
};