クラスメンバーを使用した C コールバック: テンプレートと Lambda 関数の利用
コールバック関数の概念は C で広く使用されており、1 つの関数で特定のイベントの発生時に別のイベントを呼び出します。この記事では、クラス メンバーを使用してコールバックを実装し、複数のクラス間の互換性を確保する方法に焦点を当てます。
伝統的に、コールバック関数はクラス内の静的メソッドとして宣言されます。ただし、この方法ではクラス インスタンスにポインターを渡す必要があり、面倒になる可能性があります。より効率的な解決策は、C 11 の機能、つまり std::function と std::bind を採用することです。
静的メソッドを使用する代わりに、関数オブジェクトとして機能する std::function を利用できます。引数として整数を取ります。クラス内の特定の関数にバインドするには、std::bind を使用します。イベント ハンドラーは std::function を入力として受け入れることができるため、明示的なインスタンス引数を渡す必要がなくなります。
たとえば、次のコード スニペットを考えてみましょう。
class EventHandler { public: void addHandler(std::function<void(int)> callback) { // ... } }; class MyClass { public: void Callback(int x); // ... };
このシナリオでは、 MyClass::Callback メソッドは整数の引数を受け取り、静的宣言を必要としません。ハンドラーを追加するには、単純に std::bind:
EventHandler handler; MyClass myClass; using namespace std::placeholders; handler.addHandler(std::bind(&MyClass::Callback, &myClass, _1));
を使用します。このアプローチにより、同じイベント ハンドラーが複数のクラスで動作し、コードの柔軟性と再利用性が保証されます。
さらに、次のことができます。 C 11 ラムダ関数を利用して、コールバックのシンプルさと優雅さを強化します。
handler.addHandler([](int x) { std::cout << "x is " << x << '\n'; });
Byこれらのメソッドを採用すると、クラス メンバーを使用してコールバックを効果的に実装でき、互換性とコードの簡潔性の両方を実現できます。
以上がテンプレートと Lambda 関数を含むクラスメンバーを使用して C コールバックを実装するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。