8

私は、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();
  }
};

無制限のユニオン機能を使用して、動的に割り当てられるスペースの代わりに、その場で格納できるオプションの値用に適切に配置されたスペースを作成します。参照を使用して多分<>を作成する場合を除いて、ほとんどの場合は機能します。たとえば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

多分クラスストア参照を作成するにはどうすればよいですか?クラスに対するその他の改善/提案も歓迎します。

4

2 に答える 2

8

参照でこれを機能させるには、参照の新しい配置を行うことができないため、明示的な特殊化が必要です。ストレージにポインターを使用する必要があります。

それを超えて、コードにはコピー代入演算子がありません。ムーブコンストラクターとムーブ代入演算子も便利です(特に、それが再実装の最大の理由であるためboost::optional、ブーストの1つにはそれらがありません)。

于 2012-08-09T00:22:04.280 に答える