ジェネリック 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 サイトの他の関連記事を参照してください。