11

これらの異なるバインド アプローチの違いを理解しようとしています。boost::bind および boost::phoenix::bindにも同様の質問があります

しかし、誰かがこれを例で説明できれば、それは素晴らしいことです。また、boost::phoenix が boost::bind、booost::lambda ライブラリのスーパーセットであることは本当ですか?

4

2 に答える 2

10

ストーリーは(私はストーリー全体を伝えるのに十分な年齢ではありませんが)、C++98で使いにくいbind1st/bind2ndを置き換えるために最初に作成され、その目標を達成し、現在はC++11の一部です。しかし、過去10年間でC ++の関数型プログラミングスタイルが台頭したように、boost :: lambdaは、C ++の純粋なライブラリアプローチでかなり幅広い関数型構造のセットをサポートするように(作成時に)それをプッシュします。

そして、ニュースグループから知っているように、boost::lambdaとboost::phoenixの作者は、実質的に同じ問題を扱っているため、2つのライブラリを組み合わせようとします。私はそれが美しくデザインされたブーストだったと思います::phoenix2

そして、ブースト:: protoがあります。これは、式テンプレートを作成するためのライブラリです。または、メタライブラリだと思います。したがって、フェニックスニルヴァーナは、boost :: protoで生まれ変わり、phoenix3が表示されます。phoenix3は上記の中で最も強力だと思います。

一方、C ++ 11は、ラムダ式の言語サポートを追加します。これは、個人的に非常に便利で便利だと思います。唯一の欠点は、ポリモーフィックではないことです(phoenix3ではポリモーフィック関数オブジェクトを作成できます)。

私が個人的な経験を持っているという結論として、C ++ 11ラムダ式は、可能であれば、日常業務の選択肢です。便利で、明確で、コンパイル時に使いやすいです。Phoenix3はポリモフィックで、非常に強力で、非常にクールですが、コンパイル時間が長いという欠点があります。

于 2011-11-09T01:29:56.957 に答える
1

しかし、誰かがこれを例で説明できれば、それは素晴らしいことです。

何の例?それらは同じ概念の異なる実装です。

実際に重要なのは次のとおりです。

  1. Boost.Phoenix がスタンドアロン ライブラリとしてリリースされてから (そしてもちろんboost::lambda::bindそれと同時に)、Boost.Lambda は公式に非推奨になりました。
  2. の実装は、将来的にの実装boost::bindに置き換えられる予定です。boost::phoenix::bindまだ置き換えられていない唯一の理由はboost::bind、Boost.Phoenix は厳密に C++03 準拠のコンパイラを必要とするのに対し、MSVC6 などの古い (壊れている) コンパイラをサポートしている/回避策があるためです。

これら 2 つの事実を組み合わせると、新しいコードで使用する唯一の真の候補はboost::phoenix::bind.

また、boost::phoenix が boost::bind、booost::lambda ライブラリのスーパーセットであることは本当ですか?

はい、これは正しいです。

于 2011-11-09T01:43:49.690 に答える