ホームページ > バックエンド開発 > C++ > C 11 の `std::function` と `std::bind` は異種クラス コールバックの課題をどのように解決できるでしょうか?

C 11 の `std::function` と `std::bind` は異種クラス コールバックの課題をどのように解決できるでしょうか?

Mary-Kate Olsen
リリース: 2024-12-15 22:18:17
オリジナル
624 人が閲覧しました

How Can C  11's `std::function` and `std::bind` Solve Heterogeneous Class Callback Challenges?

異種クラス間のコールバックの受け渡し

C では、さまざまなクラス間で共有できるコールバックを定義することが課題となる場合があります。静的メンバー関数を提供し、クラス インスタンスにポインターを渡すのは一般的なアプローチですが、柔軟性が制限されます。 C 11 の std::functionstd::bind:

Refactoring EventHandler

静的メソッドとインスタンス ポインターの代わりにリファクタリングする

std::function を受け入れる EventHandler:

class EventHandler {
public:
    void addHandler(std::function<void(int)> callback) {
        // ... (as above)
    }
};
ログイン後にコピー
この関数は、整数の引数を受け取り、何も返さない「関数オブジェクト」を受け入れます。

MyClass の適応

変更

MyClass は、Callback から静的キーワードを削除し、代わりに引数を指定します。

class MyClass {
public:
    void Callback(int x);
    // ...
};

MyClass::Callback(int x) {
    // ... (as above)
}
ログイン後にコピー

Callback にバインドするにはEventHandler、使用しますstd::bind:

handler->addHandler(std::bind(&MyClass::Callback, this, std::placeholders::_1));
ログイン後にコピー

_1 プレースホルダーは単一の引数を表します。

スタンドアロン関数とラムダ式

スタンドアロン関数を直接使用できます。

addHandler:

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

handler->addHandler(freeStandingCallback);
ログイン後にコピー
さらに、C 11 ラムダ式は

addHandler 内で使用できます:

handler->addHandler([](int x) { std::cout << "x is " << x << '\n'; });
ログイン後にコピー

結論

採用することで

std::functionstd::bind では、異種クラス間でコールバックをシームレスに受け渡すことができ、柔軟性とコードの再利用性が実現します。

以上がC 11 の `std::function` と `std::bind` は異種クラス コールバックの課題をどのように解決できるでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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