C+的选项/可能类别+; 我想在C++中实现Scala类选项/Haskell类,也许是类。出于效率原因,我不想使用动态分配的内存,也不想使用多态性。此外,如果选项为“无”,我不希望创建任何嵌入类型的对象 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 (); } };

C+的选项/可能类别+; 我想在C++中实现Scala类选项/Haskell类,也许是类。出于效率原因,我不想使用动态分配的内存,也不想使用多态性。此外,如果选项为“无”,我不希望创建任何嵌入类型的对象 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 (); } };,c++,new-operator,C++,New Operator,有人能告诉我以下方法是否会引起问题吗?我必须静态地为Option类中的嵌入对象分配内存,但我无法定义嵌入类型的成员字段,因为这将在创建Option对象时初始化,即使该选项为None template <typename T> class Option { private: uint8_t _storage [sizeof (T)]; T * _embedded; public: Option () : _embedded (nullptr) { }

有人能告诉我以下方法是否会引起问题吗?我必须静态地为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 ();
    }
};
模板
类选项{
私人:
uint8_t_存储[sizeof(t)];
T*_嵌入式;
公众:
选项():_嵌入式(nullptr){
}
选项(常数T和obj):_嵌入式(新(_存储)T(obj)){
}
选项(常量选项和其他)
:_嵌入式(
其他->\u嵌入式?新(\u存储)T(其他->\u嵌入式):nullptr
) {
}
// ...
~Option(){
如果(_嵌入)_嵌入->~T();
}
};

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

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

Option (const Option & other)
    : _embedded (other->_embedded ? new (_storage)T(other->_embedded) : nullptr)
{
}

我认为数组不需要像对象类那样对齐。在实践中,除非类型有有趣的对齐要求,否则我不会期望出现任何问题


C++ 2011可以使用<代码>联合/代码>来保存实际的表示,尽管您仍然需要管理保存对象的生命周期。在标准的下一个修订版中添加类似的类型有a和a。

您可以检查它是如何实现的。谢谢您的提示。我应该知道Boost有它。实际上,它是一个相当聪明的表示。您也需要处理赋值,但除此之外,我非常喜欢直接存储指针而不仅仅是布尔值。当然,这会让以后的事情变得更容易。在这里,您离实现“Variant”类型类还有半步之遥。您可能会使用boost::aligned_存储来获得缓冲区的正确对齐。根据对以下问题的回答,从placement new返回未对齐的内存是UB:实际上,在C++11中,我希望使用
std::aligned_存储
。它是专门为要求精确大小和对齐的原始存储而创建的。对于那些对提案结果感兴趣的人:引入了C++17。那么
char\u存储[sizeof(T)]呢从什么时候开始?