Реализация boost ::необязательно в С++ 11

Я экспериментирую с реализацией опциональной структуры данных boost ::с использованием функций С++ 11. Вот что у меня есть:

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

Я использую функцию неограниченного объединения, чтобы создать правильно выровненное пространство для необязательного значения, которое может быть сохранено в -situ вместо динамического распределения пространства. В основном все работает, за исключением случаев, когда я хочу создать may<> со ссылкой. Например, 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

Что я должен сделать, чтобы сделать ссылки на хранилище классов «возможно»? Любые другие улучшения/предложения по классу также приветствуются.

7
задан keveman 9 August 2012 в 01:04
поделиться