ホームページ  >  記事  >  バックエンド開発  >  std::bind はメンバー関数をどのように処理しますか?また、オブジェクト参照が必要なのはなぜですか?

std::bind はメンバー関数をどのように処理しますか?また、オブジェクト参照が必要なのはなぜですか?

DDD
DDDオリジナル
2024-10-31 23:47:29452ブラウズ

How does std::bind handle member functions, and why is an object reference required?

std::bind がメンバー関数でどのように動作するか

メンバー クラス関数で std::bind を使用する場合、いくつかの重要な概念が関係します。 :

最初の引数: ポインター

構文 std::bind(&Foo::print_sum, &foo, 95, _1) では、最初の引数は 。代わりに、これはメンバー関数自体を表す ポインター です。

2 番目の引数: オブジェクト参照

2 番目の引数、この場合は &foo 、適切なクラス (Foo) のオブジェクトへの

参照です。これは、メンバー関数が操作するオブジェクト インスタンスを必要とするため必要です。

std::bind によるメンバー関数の処理方法

内部的に、std::bind は、最初の引数はメンバー関数へのポインターであり、std::mem_fn を使用して呼び出し可能なオブジェクトに変換します。この呼び出し可能オブジェクトはメンバー関数へのポインターを保持し、最初の引数としてオブジェクト インスタンスを必要とします。

オブジェクト参照の必要性

メンバー関数にバインドする場合の場合、メンバー関数は特定のクラスに関連付けられており、そのクラスのオブジェクトを呼び出す必要があるため、オブジェクト参照が必須になります。 std::bind の 2 番目の引数はこのオブジェクト参照を提供し、メンバー関数が指定されたオブジェクトを操作できるようにします。

次のコードを考えてみましょう。

<code class="cpp">struct Foo {
    int value;
    void f(int n) { std::cout << "f(" << this->value << ", " << n << ")\n"; }
};

int main() {
    Foo foo{10};

    auto f_bound = std::bind(&Foo::f, &foo, _1);
    f_bound(20); // Output: f(10, 20)
}</code>
この例では、 f_bound は、受け取った追加の引数を使用して foo オブジェクトの f メンバー関数を呼び出す呼び出し可能オブジェクトです。したがって、 f_bound(20) を呼び出すと、「f(10, 20)」を出力する foo.f(20) を呼び出すことと同じになります。

以上がstd::bind はメンバー関数をどのように処理しますか?また、オブジェクト参照が必要なのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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