70

両者に違いはありますか?または、コード内のすべての出現箇所を置き換えて、Boostへの依存を削除しても安全boost::bindですstd::bindか?

4

4 に答える 4

90
  • boost::bind 関係演算子がオーバーロードされていますが、そうでstd::bindはありません。

  • boost::bind デフォルト以外の呼び出し規約をサポートしますが、std::bind保証されていません(標準ライブラリの実装では、これが拡張機能として提供される場合があります)。

  • boost::bindネストされたバインド式()の先行評価を防ぐための直接メカニズムを提供しますが、そうではありません。(とはいえ、必要に応じて使用することも、自分で簡単に再実装することもできます。)boost::protectstd::bindboost::protectstd::bind

  • std::bind熱心な評価を強制するために、ユーザー定義のファンクターをネストされたバインド式として扱うことができる直接メカニズムを提供します( std::is_bind_expression:[func.bind.isbind] / 1、[func.bind.bind] / 10)、そうでboost::bindはありません。

于 2012-05-11T17:13:33.333 に答える
26

他の回答で引用されているいくつかの違いに加えて、ここに2つの違いがあります。

  • boost::bindいくつかの状況でオーバーロードされた関数名をstd::bind処理するようですが、同じ方法でそれらを処理しません。c++11に関するよくある質問を参照してください

(gcc 4.7.2を使用して、libバージョン1_54をブーストします)

void foo(){}
void foo(int i){}

auto badstd1 = std::bind(foo);  
//compile error: no matching function for call to bind(<unresolved overloaded function type>)
auto badstd2 = std::bind(foo, 1); 
//compile error: no matching function for call to bind(<unresolved overloaded function type>)
auto std1 = std::bind(static_cast<void(*)()>(foo)); //compiles ok
auto std2 = std::bind(static_cast<void(*)(int)>(foo), 1); //compiles ok
auto boost1 = boost::bind(foo, 1); //compiles ok
auto boost2 = boost::bind(foo); //compiles ok

したがって、単にすべてboost::bindをに置き換えた場合std::bind、ビルドが破損する可能性があります。

  • std::bindc ++ 11ラムダタイプにシームレスにバインドできますがboost::bind、ブースト1.54では、ユーザーからの入力が必要なようです(return_typeが定義されていない場合)。ブーストドキュメントを参照してください

(gcc 4.7.2を使用して、libバージョン1_54をブーストします)

auto fun = [](int i) { return i;};
auto stdbound = std::bind(fun, std::placeholders::_1);
stdbound(1);

auto boostboundNaive = boost::bind(fun, _1);  //compile error.
// error: no type named ‘result_type’ ...
auto boostbound1 = boost::bind<int>(fun, _1); //ok
boostbound1(1);
auto boostbound2 = boost::bind(boost::type<int>(), fun, _1); //ok
boostbound2(1);

したがって、単にすべてstd::bindをに置き換えた場合boost::bind、ビルドも破損する可能性があります。

于 2013-08-07T00:36:25.143 に答える
16

上記のほかに、boost :: bindには重要な拡張ポイントがあります。get_pointer()関数を使用すると、boost::bindを任意のスマートポインターと統合できます。ATL ::CComPtrなど 。http ://www.boost.org/doc/libs/1_49_0/libs/bind/mem_fn.html#get_pointer

その結果、boost :: bindを使用して、weak_ptrをバインドすることもできます:http: //lists.boost.org/Archives/boost/2012/01/189529.php

于 2012-05-13T09:54:31.700 に答える
8

完全な答えはありませんが、std::bindパラメータリストではなく可変個引数テンプレートを使用します。

プレースホルダーは、グローバル名前空間ではなく、のstd::placeholdersようになります。std::placeholders::_1

名前空間をstdphにエイリアスします

namespace stdph=std::placeholders;

それを除けば、C++11へのアップデートに問題はありませんでした

于 2012-05-11T16:58:38.247 に答える