7

Scala ライクな Option / Haskell ライクな Maybe クラスを C++ で実装したいと考えています。効率的な理由から、私は動的に割り当てられたメモリを使用したくありませんし、ポリモーフィズムも使用したくありません。さらに、オプションが 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 では、a を使用して実際の表現を保持できますがunion、保持されたオブジェクトの有効期間を管理する必要はあります。標準の次の改訂に同様のタイプを追加するboost::optional<T>という提案があります。

于 2012-10-21T09:02:00.923 に答える