Я экспериментирую с реализацией опциональной структуры данных 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
Что я должен сделать, чтобы сделать ссылки на хранилище классов «возможно»? Любые другие улучшения/предложения по классу также приветствуются.