在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();
  }
};

我利用无限制联合功能为可选值创建一个正确对齐的空间,该空间可以原位存储,而不是动态分配空间.事情很有效,除非我想创建一个可能的<>有参考.例如,可能< int&>导致g 4.7抱怨:

error: ‘maybe<int&>::<anonymous union>::value’ may not have reference type ‘int&’
because it is a member of a union

我该怎么做才能制作类商店参考?我们也欢迎任何其他改进/建议.

解决方法

要使这个工作与引用一起使用,你肯定需要一个显式的特化,因为你不能做一个新的引用:你需要使用指针存储.

除此之外,代码缺少一个复制赋值运算符.移动构造函数和移动赋值运算符也会很好(特别是因为这是重新实现boost :: optional的第一个原因:boost中的那个缺少它们).

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...