2012-06-07 12 views
22

Boost.Optionalは、ダミータイプを使用して、boost::optional<T>の初期化されていないインスタンスを構築できます。このタイプはnone_tと呼ばれ、インスタンスnoneは、すでに私たちは次のようなコードを記述することができ、利便性のためのヘッダで定義されていますboost :: none_tの実装の根拠は何ですか?

boost::optional<int> uninitialized(boost::none); 

none_tの定義を見て、私はそれが実際にあることに気づきましたいくつかのダミー構造体へのポインタ・ツー・メンバーに対応するのtypedef:このような単純な空の構造体の上に、このような複雑なのtypedefを使用することの利点は何

namespace boost { 

namespace detail { struct none_helper{}; } 

typedef int detail::none_helper::*none_t ; 

none_t const none = (static_cast<none_t>(0)) ; 

} // namespace boost 

namespace boost { 

struct none_t {}; 

none_t const none; 

} // namespace boost 
+1

これはちょうど[Safe-Bool Idiom](http://www.artima.com/cppsource/safebool.html)の構造であることがわかりました。 –

+0

@MatthieuM .: 2012年6月にあなたの答えに掲載されたコメントNawazを読んだだけですか? ;) –

+0

いいえ、自分でそれを再発見しました:/朝は難しいです:/ –

答えて

17

ああ、私は深く掘り下げることは考えていませんでした。

通常のstructに1つ(多かれ少なかれ明白な)利点があり、今ではnoneがブール値のコンテキストでfalseと評価されています。

他の利点よりも1つの利点は、メンバーへのポインタが不可欠な型への有害なプロモーションから防止されることです。

だから、それはfalseと評価されるオブジェクトを持つ安全で簡潔な方法を提供すると思います。

EDIT:ここでは、(hum ...)の構造を認識する必要があります。

+0

ああ... 'boost :: none'は本当に' false'に変換します。 :D – Nawaz

+0

それは理にかなっていますが、私は 'none'を' false'に変換できる点を実際には見ていません。 IMHO、それは 'none'が' optional'であるという誤った印象を与えるだけです。しかしおそらく、私は図書館の作者によって予期されるいくつかのコーナーケースを見落としています。 –

+2

とにかく、[Safe Bool Idiom](http://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Safe_bool)にちょうど従います。 – Nawaz

関連する問題