7

我想在 C++ 中实现一个类 Scala 的 Option / Haskell 类的 Maybe 类。出于效率原因,我不想使用动态分配的内存,也不想使用多态性。此外,如果 Option 为 None,我不希望创建任何嵌入类型的对象。

谁能告诉我以下方法是否会导致问题?我必须为我的 Option 类中的嵌入对象静态分配内存,但我无法定义嵌入类型的成员字段,因为即使 Option 为 None,这也会在创建 Option 对象时初始化。

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

2 回答 2

3

我不认为数组需要以与对象类可能需要的相同方式对齐。实际上,除非该类型具有有趣的对齐要求,否则我不会期望任何问题。

使用 C++ 2011,您可以使用 aunion来保存实际的表示,尽管您仍然需要管理所持有对象的生命周期。有boost::optional<T>一个建议将类似类型添加到标准的下一个修订版中。

于 2012-10-21T09:02:00.923 回答
1

对我来说,这看起来不错,除了:

uint8_t _storage [sizeof(T)/sizeof(uint8_t)];

Option (const Option & other)
    : _embedded (other->_embedded ? new (_storage)T(other->_embedded) : nullptr)
{
}
于 2012-10-21T08:58:20.993 回答