ホームページ > バックエンド開発 > C++ > std::function でメンバー関数ポインターを正しく使用する方法は?

std::function でメンバー関数ポインターを正しく使用する方法は?

Mary-Kate Olsen
リリース: 2024-12-20 13:40:10
オリジナル
1004 人が閲覧しました

How to Correctly Use Member Function Pointers with std::function?

std::function オブジェクトでメンバー関数ポインターを処理する方法

std::function オブジェクト内のメンバー関数を操作する場合、特定の複雑な問題が発生する生じる可能性があります。次のコードを考えてみましょう。

#include <functional>

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

非静的メンバー関数が暗黙的に "this" ポインターを引数として渡すため、エラーが発生します。ただし、ここでの std::function シグネチャはこの引数を考慮していません。

解決策: メンバー関数を std::function オブジェクトにバインドする

この問題に対処するには、次のようにします。最初の引数 (「this」) は明示的にバインドする必要があります:

std::function<void(void)> f = std::bind(&Foo::doSomething, this);
ログイン後にコピー

パラメーターを持つ関数の場合、プレースホルダーを利用できます:

using namespace std::placeholders;
std::function<void(int, int)> f = std::bind(&Foo::doSomethingArgs, this, _1, _2);
ログイン後にコピー

C 11 では、ラムダも使用できます:

std::function<void(int, int)> f = [=](int a, int b) {
    this->doSomethingArgs(a, b);
};
ログイン後にコピー

これらの手法を組み込むことで、プログラマは std:: 内でメンバー関数ポインターを正常に操作できます。関数オブジェクトを使用して、暗黙的な「this」引数を効果的に管理します。

以上がstd::function でメンバー関数ポインターを正しく使用する方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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