異種クラス間のコールバックの受け渡し
C では、さまざまなクラス間で共有できるコールバックを定義することが課題となる場合があります。静的メンバー関数を提供し、クラス インスタンスにポインターを渡すのは一般的なアプローチですが、柔軟性が制限されます。 C 11 の std::function と std::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::function と std::bind では、異種クラス間でコールバックをシームレスに受け渡すことができ、柔軟性とコードの再利用性が実現します。
以上がC 11 の `std::function` と `std::bind` は異種クラス コールバックの課題をどのように解決できるでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。