ホームページ >バックエンド開発 >C++ >メンバー関数ポインターを汎用 `std::function` オブジェクトに格納するにはどうすればよいですか?

メンバー関数ポインターを汎用 `std::function` オブジェクトに格納するにはどうすればよいですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-12-23 20:39:10262ブラウズ

How to Store Member Function Pointers in Generic `std::function` Objects?

ジェネリック std::function オブジェクトへのメンバー関数ポインターの格納

使用してマップ内の特定のクラスのメンバー関数ポインターを格納しようとする場合std::function オブジェクトを使用すると、開発者は「term は 0 引数を取る関数として評価されません」というエラーに遭遇する可能性があります。このエラーは、メンバー関数ポインターを std::function オブジェクトに直接割り当てるときに発生します。

問題の核心は、非静的メンバー関数が最初の引数として暗黙的な "this" ポインターを必要とするという事実にあります。 。これを修正するには、最初の引数を明示的にバインドする必要があります。

解決策:

std::function<void(void)> f = std::bind(&Foo::doSomething, this);

このアプローチは、「this」ポインタを最初の引数として効果的にバインドし、メンバー関数を正しくキャプチャするための std::function オブジェクト。

による関数の処理パラメータ:

パラメータを持つメンバー関数の場合、バインドされた引数の位置を示すためにプレースホルダーを指定する必要があります。

using namespace std::placeholders;
std::function<void(int, int)> f = std::bind(&Foo::doSomethingArgs,
                                                 this,
                                                 std::placeholders::_1,
                                                 std::placeholders::_2);

C 11 Lambda 構文:

コンパイラーが C 11 ラムダをサポートしている場合、より簡潔なアプローチは次のようになります。利用:

std::function<void(int, int)> f = [=](int a, int b) {
    this->doSomethingArgs(a, b);
};

これらの手法に従うことで、開発者はジェネリック std::function オブジェクトを使用してメンバー関数ポインターを効果的に保存し、呼び出すことができます。

以上がメンバー関数ポインターを汎用 `std::function` オブジェクトに格納するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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