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

std::bind は C のメンバー関数をどのように処理しますか?

Susan Sarandon
リリース: 2024-10-29 21:57:02
オリジナル
433 人が閲覧しました

How does std::bind handle member functions in C  ?

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

std::bind は、呼び出し可能なオブジェクトを作成するための C の強力なツールです。メンバー関数を使用する場合、混乱を招く可能性のあるいくつかの固有の側面が生じます。 std::bind がメンバー関数をどのように解釈して利用するかを見てみましょう。

最初の引数: なぜポインターなのか?

std::bind の最初の引数は呼び出し可能です。オブジェクト。関数、ラムダ、またはメンバー関数の場合もあります。メンバー関数を使用する場合、最初の引数がそのメンバー関数へのポインターであることを理解することが重要です。これは、すべての非静的メンバー関数がオブジェクト内のポインターとして格納されるためです。

メンバー関数へのポインターを取得するには、& 演算子が使用されます。たとえば、次のコードでは:

Foo foo;
auto f = std::bind(&Foo::print_sum, &foo, 95, _1);
ログイン後にコピー

&Foo::print_sum は、クラス Foo 内の print_sum メンバー関数へのポインタを返します。

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

メンバー関数を使用する場合の std::bind の 2 番目の引数は、メンバー関数が属するオブジェクトへの参照です。これは、メンバー関数が関連付けられているオブジェクトにアクセスする必要があるためです。

上記の例では、f は foo オブジェクトにアクセスできる必要があります。 2 番目の引数として &foo 参照を指定することにより、std::bind は f に対して行われたすべての呼び出しが foo オブジェクトにバインドされるようにします。

std::bind の内部処理

内部的に、std::bind は最初の引数を分析し、それがメンバー関数へのポインターであるかどうかを判断します。存在する場合は、 std::mem_fn() または同様のメカニズムを使用して、それを適切な呼び出し可能オブジェクトに変換します。この呼び出し可能オブジェクトは、メンバー関数へのポインターとオブジェクトへの参照の両方をカプセル化します。

よりわかりやすく説明するために、次のコードを考えてみましょう。

struct Foo {
    void print(int n) { std::cout << n << '\n'; }
};

Foo foo;

std::bind(&Foo::print, &foo, 42)();
ログイン後にコピー

この例では、std::bind は、print メンバー関数と foo オブジェクトへの参照を組み合わせた呼び出し可能オブジェクトを作成します。この呼び出し可能オブジェクトが呼び出されると、実質的に foo.print(42) が呼び出されます。

結論

std::bind がメンバー関数でどのように動作するかを理解することは、効果的に実行するために重要です。このテクニックを使って。最初の引数はメンバー関数へのポインターであり、2 番目の引数はオブジェクトへの参照であることに注意してください。 std::bind は、これらの引数を内部的に処理して、メンバー関数を特定のオブジェクトにバインドする便利な方法を提供する呼び出し可能なオブジェクトを作成します。

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

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート