5

std::bindの使用方法を説明する簡単な例を次に示します。

引数が 3 つある関数 f3(x, y, z) があるとします。次のように定義された 2 つの引数の関数が必要ですf2(x,y) = f3(x,5,y)。C++ では、次のように簡単に実行できますstd::bind

auto f2 = std::bind(f3, _1, 5, _2);

この例は私には明らかです。std::bind関数を最初の引数として取り、次に n 個の他の引数を取ります。ここで、n は の最初の引数として取り込まれる関数の引数の数ですstd::bind

ただし、バインドの別の使用法を見つけました。

void foo( int &x )
{
  ++x;
}


int main()
{
  int i = 0;

  // Binds a copy of i
  std::bind( foo, i ) (); // <------ This is the line that I do not understand.
  std::cout << i << std::endl;

}

fooには1 つの引数があり、std::bindそれが に設定されていることは明らかですi。しかし、なぜ の後にもう 1 組のかっこを使用するの(foo, i)でしょうか。そして、なぜ出力を使用しないのstd::bindですか? つまり、なぜ私たちは持っていないのauto f = std::bind(foo, i)ですか?

4

4 に答える 4

8

この線

std::bind( foo, i ) ();

次と同等です。

auto bar = std::bind( foo, i );
bar();

バインドされたファンクターを作成し、すぐにそれを呼び出します (2 番目の括弧のペアを使用)。

編集:精度の名の下に(そして@Roman、@daramarakによって指摘されました)、2つは実際には関数を直接呼び出すことと同等ではありません.iは値によってstd::bindに渡されます。fooi で直接呼び出すのと同等のコードは、次のようになります。

auto bar = std::bind( foo, std::ref(i) );
bar();
于 2013-03-21T08:49:46.353 に答える
3

一時オブジェクトにバインドfooし、すぐに呼び出します。

  auto f = std::bind(foo, i);
  f();

単線バージョン:

std::bind(foo, i)();
于 2013-03-21T08:51:59.457 に答える
2

あなたの2つの質問はお互いにほとんど答えています。末尾()は単なる通常の関数呼び出しです。したがって、式は次のことを意味ifooます。コードの作成者は、関数が呼び出された後はもう必要ないと判断したため、どこにも保存されていません。

于 2013-03-21T08:50:30.747 に答える
0

ライン以来

std::bind( foo, i ) () ;

... は ... と同じことを行います

foo(i);

...これは、実際のコードで遭遇する可能性のある std::bind の「使用」ではありませんが、他の回答で説明されているように、 std::bind が行うことの簡単な例として役立ちます。

ご指摘のとおり、バインドの結果を保存して別の場所に呼び出すのが通常のケースです。そうしないと、最初に std::bind を使用してコードを複雑にする意味がありません。

于 2014-02-24T18:59:04.347 に答える