私はScalaのようなOption/HaskellのようなMaybeクラスをC++で実装したいと思います。効率の理由から、私は動的に割り当てられたメモリを使いたくないし、多形性を使いたくない。また、OptionがNoneの場合、埋め込み型のオブジェクトを作成したくないです。オプション/多分C++用のクラス
次の方法で問題が発生する可能性はありますか? 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();
}
};
[Boost.Optional](http://www.boost.org/doc/libs/1_51_0/libs/optional/doc/html/index.html)の実装方法を確認できます。 – kennytm
ヒントをありがとう。私はブーストが持っていることを知っていたはずです。 – JohnB
これは実際には賢い表現です。 **割り当て**も処理する必要がありますが、そうでなければ、ブール値ではなくポインタを直接格納するという考えが本当に好きです。後で物事を楽にします。 –