「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > クラスメンバーと `std :: function`を使用して汎用C ++コールバックを実装する方法は?

クラスメンバーと `std :: function`を使用して汎用C ++コールバックを実装する方法は?

2025-03-22に投稿されました
ブラウズ:406

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

c汎用実装を持つクラスメンバーを使用したコールバック

異なるクラスで一貫して機能する一般的なイベント処理メカニズムを作成することを目的とした元の質問。静的メソッドに依存してクラスインスタンスポインターを渡す代わりに、STD :: functionおよびstd :: bindを使用して、より最新のCアプローチを使用できます。関数オブジェクトは、通常の関数ポインターのように渡すことができる呼び出し可能なエンティティを表します。イベントハンドラーメソッドのaddhandlerはstd :: function を引数として取得します。ここで、渡された関数には戻り値がなく、整数を引数として取得します。 { 公共: void addhandler(std :: function callback) { cout

特定の関数

を結合するために、特定のクラスメソッドをイベントハンドラーにバインドします。STD:: BINDが使用されます。 std :: bindイベントがトリガーされたときにこのポインターと呼び出される関数を指定します。 { 公共: myclass(); //注:「static」とマークされなくなり、実際の引数のみを取るだけです void callback(int x); プライベート: int private_x; }; myclass :: myclass() { 名前空間STD ::プレースホルダーを使用します。 // `_1`の場合 private_x = 5; ハンドラー - > addhandler(std :: bind(&myclass :: callback、this、_1)); } void myclass :: callback(int x) { //明示的な「インスタンス」引数はもう必要ありません。 //「This」が適切にセットアップされます cout

class EventHandler
{
public:
    void addHandler(std::function callback)
    {
        cout  

コールバックがクラスのコンテキストのない自立型関数の場合、std :: bindは不要です。 { // ... } int main() { // ... ハンドラー - > addhandler(freestindingcallback); }

匿名のコールバックの場合、lambda関数はイベントハンドラーで使用できます。さまざまなクラスや関数に適用できるコールバック用の柔軟な一般的なソリューション。

最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3