2012-05-07 14 views
2

私はクラスのための安全なブールイディオムを実装する(Boost.Operatorsから)boost::bool_testable<>を活用しようとしているが、ライブラリー(この記事のように1.49)の最新バージョンは、もうそれを持っていないようです。boost :: bool_testable <>が再配置されたか、削除されましたか?

どこに行きましたか?今すぐ利用できるより良い代替品がありますか?それを見逃しましたか?

私はC++ 11、したがって、安全なブール値が不要なレンダリング言語拡張を使用することはできませんを使用することはできませんよ。

+1

(http://boost.2283326.n4.nabble.com/operator-safe-bool-td2617427 .html))。どんなバージョンのブーストでそれを見たのですか? –

答えて

6

それは後半の答えですが、私は短い時間のためにスタックオーバーフローにのみ有効だと私はちょうどあなたの質問を見つけました。私はBoost.Operatorsのメンテナで、2003年12月にはremovedbool_testableに戻ってしまい、誤ってリリースされる可能性があります。

サム・パーティントンは、数週間前にそれを提案し、私は、CVSリポジトリにこれを追加しました。それは当初は有望に見えましたが、すぐに問題が現れました。

メイン問題、IIRC、クラスTboost::bool_testable<T>由来の変換検出と関連していました。 boolに変換できますが、intに変換できないクラスは、boost::is_convertible<T,int>::value == falseになりますが、あいまいになり、コンパイルに失敗しました。

他にも問題があり、そのうちの1つは別の問題を解消することを暗示していました。 1つの例には、ユーザがbool自身のoperator int()に明示的に変換したかったタイプが含まれていました。

長いストーリーは短いので、十分に頑強にする方法を考え出すことはありませんでした。疑わしい場合には、潜在的な問題と比較して、利益が小さすぎる(コピー〜ペーストコードの5行まで安全)、それを安全にプレイすることにしたため、取り除いた。

これを取り除いた後も問題は解決されず、最終的にSafe-Bool-Idiomコードをコピーしてクラスにコピーし始めました。あるいは、ある時点でexplicit operator bool()が利用可能になった。

つまり、手動で行をコピーするだけの方がいいでしょう。私はそれがエレガントな解決策ではないことを知っていますし、コピー貼り付けも気に入らないのですが、それ以外の選択肢はすべて悪いことでした。私はbool_testable`を追加しましたが、その後、直後に削除され、リリース([参照]に存在しなかった `検索によると

+0

それはそうですね。その除去を正当化する素晴らしい答え。ありがとう! – fbrereto

+0

あなたが記述したイベントとC++が進化したのはほぼ10年ですから、今日のイディオムは安全で頑丈な方法で再導入できると思いますか? – CygnusX1

+0

@ CygnusX1 '明示的な演算子bool()'があるので、慣用句を再導入する必要はありません。もしそうなら、それは*新しい*セーフ・ブール・イディオムです。 –

関連する問題