我正在尝试使用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(); } };
我利用无限制联合功能为可选值创建一个正确对齐的空间,该空间可以原位存储,而不是动态分配空间.事情很有效,除非我想创建一个可能的<>有参考.例如,可能< int&>导致g 4.7抱怨:
error: ‘maybe<int&>::<anonymous union>::value’ may not have reference type ‘int&’ because it is a member of a union
我该怎么做才能制作类商店参考?我们也欢迎任何其他改进/建议.