クラス メンバー関数を使用しない C のコールバック メカニズム
コールバック関数は、特定のイベントが発生したときに呼び出される関数を登録する方法を提供します。静的メソッドを使用し、クラス インスタンスをパラメータとして渡すのは一般的なアプローチですが、異なるクラス間でコールバックを使用する柔軟性が制限されます。
C 11 以降の std::function と std::bind
C 11 では、関数ポインターのタイプセーフなラッパーである std::function が導入されました。これにより、コールバックが参照するクラスに関係なく、コールバックをオブジェクトとして保存できるようになります。さらに、 std::bind は、関数を特定のオブジェクトとその引数にバインドするために使用されます。
イベント ハンドラー クラスの例、EventHandler:
class EventHandler { public: void addHandler(std::function<void(int)> callback) { cout << "Handler added..." << endl; callback(1); // trigger the event } };
次に、MyClass と YourClass を考えてみましょう。どちらも独自のコールバック関数を実装し、次を使用して登録することで、このイベント ハンドラーを使用できます。 std::bind:
class MyClass { public: MyClass() { private_x = 5; handler->addHandler(std::bind(&MyClass::Callback, this, _1)); } private: int private_x; void Callback(int x) { cout << x + private_x << endl; } }; class YourClass { public: YourClass() { handler->addHandler(std::bind(&YourClass::Callback, this, _1)); } private: void Callback(int x) { // Do something with x } };
Lambda 関数と EventHandler
さらに、C 11 ではラムダ関数が導入され、匿名関数を定義するための簡潔かつ簡単な方法が提供されました。これらをイベント ハンドラーと使用して、高度にカスタマイズ可能なコールバックを作成できます。
handler->addHandler([](int x) { cout << "Lambda callback executed with x: " << x << endl; });
これにより、コールバックを定義し、特定のクラス メソッドからコールバックを分離する際の柔軟性が向上します。
以上がC では、クラス メンバー関数に依存せずに柔軟なコールバック メカニズムをどのように実現できるでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。