FSM*_*axB 3 c++ constructor initialization c++14
我想创建一个模板,其中包含一个应该保持未构造的私有成员,直到使用placement new显式构造它.
如何用C++ 14实现这一目标?
有点像这样:
template <typename T>
class Container {
private:
T member; //should be left unconstructed until construct() is called
public:
Container() = default;
void construct() {
new (&this->member) T();
}
};
Run Code Online (Sandbox Code Playgroud)
有一种比Nir更干净的方式,使用类似联合的类:
template <typename T>
class Container {
private:
bool is_constructed = false;
union { T member; };
public:
Container() {}
~Container() {
if (is_constructed) {
member.~T();
}
}
void construct() {
assert(!is_constructed);
new (&this->member) T();
is_constructed = true;
}
};
Run Code Online (Sandbox Code Playgroud)
您可能还想添加其他构造函数/赋值运算符.当然,在这个简单的情况下std::optional
,完全相同的事情,但更清洁.如果你想在其他状态下编码,或者有多个成员由同一个标志管理,你想要避免bool
类似的开销,这仍然很有用is_constructed
.