ホームページ > バックエンド開発 > C++ > メンバー関数ポインターを標準ライブラリ関数オブジェクトに保存するにはどうすればよいですか?

メンバー関数ポインターを標準ライブラリ関数オブジェクトに保存するにはどうすればよいですか?

Linda Hamilton
リリース: 2024-12-22 21:20:11
オリジナル
877 人が閲覧しました

How to Store Member Function Pointers in Standard Library Function Objects?

標準ライブラリ関数を使用したメンバー関数への関数ポインター

以下を含むマップ内のクラスのメンバー関数への関数ポインターを格納しようとしました。標準ライブラリ関数オブジェクトを使用すると、一般的なエラーが発生します。以下のコードに示されているように、メンバー関数を関数オブジェクトに直接割り当てるとエラーが発生します。

#include <functional>

class Foo {
public:
    void doSomething() {}
    void bindFunction() {
        // ERROR
        std::function<void(void)> f = &Foo::doSomething;
    }
};
ログイン後にコピー

発生したエラーは、オブジェクトに対するメンバー関数の暗黙的な要件が原因です。メンバー関数は常にオブジェクトを使用して呼び出され、実質的に "this" ポインターを最初の引数として渡します。

この問題を解決するには、関数のシグネチャで、関数が引数を取らないことを指定する必要があります (

std::function<void(void)> f = std::bind(&Foo::doSomething, this);
ログイン後にコピー
)。 void(void)>)。さらに、最初 (唯一) の引数をバインドする必要があります。これは、std::bind():

using namespace std::placeholders;
std::function<void(int, int)> f = std::bind(&Foo::doSomethingArgs, this, std::placeholders::_1, std::placeholders::_2);
ログイン後にコピー
関数にパラメーターが必要な場合、プレースホルダーを使用できます:

std::function<void(int, int)> f = [=](int a, int b) {
    this->doSomethingArgs(a, b);
};
ログイン後にコピー
C 11 ラムダも利用できます:

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

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