Option/Maybe класс для C++
Я хотел бы реализовать Scala-подобный Option / Haskell-подобный класс Maybe в C++. Из соображений эффективности я не хочу использовать динамически выделяемую память и не хочу использовать полиморфизм. Кроме того, я не хочу, чтобы какой-либо объект встроенного типа создавался, если параметр имеет значение None.
Кто-нибудь может сказать мне, может ли следующий подход вызвать проблемы? Мне нужно статически распределить память для встроенного объекта в моем классе Option, но я не могу определить поле члена встроенного типа, так как это будет инициализировано при создании объекта Option, даже если Option - None.
template <typename T>
class Option {
private:
uint8_t _storage [sizeof (T)];
T * _embedded;
public:
Option () : _embedded (nullptr) {
}
Option (const T & obj) : _embedded (new (_storage) T (obj)) {
}
Option (const Option<T> & other)
: _embedded (
other->_embedded ? new (_storage) T (other->_embedded) : nullptr
) {
}
// ...
~Option () {
if (_embedded) _embedded->~T ();
}
};
2 ответа
Я не думаю, что массив должен быть выровнен так же, как может потребоваться класс объекта. На практике я не ожидал бы никаких проблем, если у типа нет забавных требований выравнивания.
С C++ 2011 вы можете использовать union
чтобы сохранить фактическое представление, хотя вам все равно нужно управлять временем жизни удерживаемого объекта. E сть boost::optional<T>
и предложение добавить аналогичный тип в следующую редакцию стандарта.
Для меня это выглядит хорошо, за исключением:
uint8_t _storage [sizeof(T)/sizeof(uint8_t)];
Option (const Option & other)
: _embedded (other->_embedded ? new (_storage)T(other->_embedded) : nullptr)
{
}