ホームページ > バックエンド開発 > C++ > クラスメンバーと「std::function」を使用して汎用 C コールバックを実装するにはどうすればよいですか?

クラスメンバーと「std::function」を使用して汎用 C コールバックを実装するにはどうすればよいですか?

Patricia Arquette
リリース: 2024-12-07 18:56:18
オリジナル
488 人が閲覧しました

How to Implement Generic C   Callbacks Using Class Members and `std::function`?

汎用実装でクラス メンバーを使用した C コールバック

元の質問は、異なるクラス間で一貫して動作する汎用イベント処理メカニズムを作成することを目的としていました。静的メソッドに依存してクラス インスタンス ポインターを渡す代わりに、std::function と std::bind.

Event Handler with std::function

イベント ハンドラー クラスは、引数として std::function オブジェクトを受け入れるようになりました。関数オブジェクトは、通常の関数ポインタのように渡すことができる呼び出し可能なエンティティを表します。イベント ハンドラー メソッド addHandler は std::function を受け取ります。

class EventHandler
{
public:
    void addHandler(std::function<void(int)> callback)
    {
        cout << "Handler added..." << endl;
        // Let's pretend an event just occured
        callback(1);
    }
};
ログイン後にコピー
特定の関数のバインド

特定のクラス メソッドをイベント ハンドラーにバインドするには、std ::バインドが使用されます。 std::bind は、this ポインターと、イベントがトリガーされたときに呼び出される関数を指定します。

class MyClass
{
public:
    MyClass();

    // Note: No longer marked `static`, and only takes the actual argument
    void Callback(int x);
private:
    int private_x;
};

MyClass::MyClass()
{
    using namespace std::placeholders; // for `_1`

    private_x = 5;
    handler->addHandler(std::bind(&MyClass::Callback, this, _1));
}

void MyClass::Callback(int x)
{
    // No longer needs an explicit `instance` argument,
    // as `this` is set up properly
    cout << x + private_x << endl;
}
ログイン後にコピー
自立関数と Lambda 関数

コールバックが自立型の場合クラスコンテキストのない関数、std::bind は必要ありません。

void freeStandingCallback(int x)
{
    // ...
}

int main()
{
    // ...
    handler->addHandler(freeStandingCallback);
}
ログイン後にコピー
匿名の場合

handler->addHandler([](int x) { std::cout << "x is " << x << '\n'; });
ログイン後にコピー
このように、std::function と std::bind を使用すると、さまざまなクラスに適用できるコールバックの柔軟で汎用的なソリューションが提供されます。と関数。

以上がクラスメンバーと「std::function」を使用して汎用 C コールバックを実装するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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