kev*_*man 7 c++ maybe c++11 boost-optional
我正在尝试使用c ++ 11功能实现boost :: optional之类的数据结构.这是我到目前为止:
template<typename T>
struct maybe {
bool valid;
union {
T value;
};
maybe() : valid(false) {}
maybe(const T& _v) {
valid = true;
new (&value) T(_v);
}
maybe(const maybe& other) {
if (other.valid) {
valid = true;
new (&value) T(other.value);
}
else valid = false;
}
~maybe() {
if (valid)
value.~T();
}
bool is_valid() { return valid; }
operator T&() {
if (valid) return value;
throw std::bad_exception();
}
};
Run Code Online (Sandbox Code Playgroud)
我利用无限制联合功能为可选值创建一个正确对齐的空间,该空间可以原位存储,而不是动态分配空间.事情主要起作用,除非我想创建一个带引用的<>.例如maybe<int&>
导致g ++ 4.7抱怨:
error: ‘maybe<int&>::<anonymous union>::value’ may not have reference type ‘int&’
because it is a member of a union
Run Code Online (Sandbox Code Playgroud)
我该怎么做才能制作类商店参考?我们也欢迎任何其他改进/建议.
要使这个工作与引用一起使用,你肯定需要一个显式的特化,因为你不能做一个新的引用:你需要使用指针存储.
除此之外,代码缺少复制赋值运算符.移动构造函数和移动赋值运算符也很不错(特别是因为这是重新实现的boost::optional
第一个原因:boost中的那个缺少它们).