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)
{
}
Другие вопросы по тегам