ホームページ >バックエンド開発 >C++ >`std::bind` は C のメンバー関数でどのように動作しますか?

`std::bind` は C のメンバー関数でどのように動作しますか?

Barbara Streisand
Barbara Streisandオリジナル
2024-10-29 21:38:30810ブラウズ

How does `std::bind` work with member functions in C  ?

メンバー関数を使用した std::bind について

C の多用途ツールである std::bind を使用すると、後で呼び出すためのバインドされた関数を作成できます。メンバー関数での使用法を理解するのは難しい場合がありますが、この説明は、関係する複雑さを明らかにすることを目的としています。

最初の引数: 参照ではなくポインター

メンバーのバインディングを宣言する場合関数の場合、std::bind の最初の引数はメンバー関数への参照ではなく、そのメンバー関数へのポインターです。これは、関数とデータ メンバーが引数として渡されると同様にポインターに分解されるためです。

2 番目の引数: オブジェクトまたはポインター

メンバー関数を扱うときの 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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。