C の多用途ツールである std::bind を使用すると、後で呼び出すためのバインドされた関数を作成できます。メンバー関数での使用法を理解するのは難しい場合がありますが、この説明は、関係する複雑さを明らかにすることを目的としています。
メンバーのバインディングを宣言する場合関数の場合、std::bind の最初の引数はメンバー関数への参照ではなく、そのメンバー関数へのポインターです。これは、関数とデータ メンバーが引数として渡されると同様にポインターに分解されるためです。
メンバー関数を扱うときの std::bind の 2 番目の引数は、オブジェクトを指定します。または、メンバー関数の呼び出しに使用されるオブジェクトへのポインター。これが必要なのは、メンバー関数には、所属するオブジェクトを指す暗黙的な this ポインターがあるためです。
内部的には、std::bind はポインターをラップする呼び出し可能オブジェクトを作成するように見えます。メンバー関数に。このバインドされた関数を呼び出すとき、指定されたオブジェクトが this ポインターとして使用されます。
特定のオブジェクトから独立した関数ポインターとは異なり、メンバー関数ポインターはは、それらが属するクラスに関連付けられていますが、そのクラスの任意のオブジェクトで使用できます。 std::bind は、メンバー関数を処理するときに 2 番目の引数としてオブジェクト ポインターを要求することでこれをサポートします。
次のコードを考えてみましょう。
<code class="cpp">struct Foo { void print_sum(int n1, int n2) { std::cout << n1 + n2 << '\n'; } }; Foo foo; auto f = std::bind(&Foo::print_sum, &foo, 95, _1);</code>
この中でたとえば、std::bind の最初の引数は &Foo::print_sum で、これは Foo クラス内のメンバー関数 print_sum へのポインターです。 2 番目の引数は &foo で、foo オブジェクトへのポインターです。 f を呼び出すとき、&foo が this ポインターとして使用され、foo オブジェクトの正しいコンテキストで print_sum を呼び出すことができます。
以上が`std::bind` は C のメンバー関数でどのように動作しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。