我正在尝试使用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
我该怎么做才能制作类商店参考?我们也欢迎任何其他改进/建议.