ホームページ > バックエンド開発 > C++ > コールバックはどのように C コードの機能を強化できるのでしょうか?

コールバックはどのように C コードの機能を強化できるのでしょうか?

DDD
リリース: 2024-12-10 18:22:12
オリジナル
499 人が閲覧しました

How Can Callbacks Enhance C   Code Functionality?

C のコールバック

コールバックは、関数またはクラスによって受け入れられる呼び出し可能なオブジェクトであり、コールバックに基づいて現在のロジックをカスタマイズするために使用されます。

いつ使用するかコールバック:

  • 呼び出される関数のロジックから独立した汎用コードの作成。
  • 動的なランタイム動作の有効化 (ゲーム内のボタン機能の変更など)。
  • 発信者に特定の内容を通知するevents.

C 11 の呼び出し可能オブジェクト:

コールバックはさまざまな形式を取ることができ、すべて「呼び出し可能」とみなされます:

  • 関数ポインタ
  • std::functionオブジェクト
  • ラムダ式
  • バインド式
  • 関数オブジェクト (オーバーロードされた関数呼び出し演算子を持つクラス)

コールバック表記:

1.関数ポインター

  • typedef return_type (*f_int_t) (int);
  • int (* foo_p)(int) = &foo;
  • int foob​​ar (int x, int (*moo)(int));
  • int foobar (int x, f_int_t moo);

2.メンバー関数へのポインタ

  • typedef int (C::* f_C_int_t) (int x);
  • int (C::* C_foo_p)(int) = & C::foo;
  • int C_foobar (int x, C const &c, int (C::*moo)(int));
  • int C_foobar (int x, C const &c, f_C_int_t moo);

3. std::function オブジェクト

  • std::function stdf_foo = &foo;
  • int stdf_foobar (int x, std::function moo);

4.テンプレート化されたコールバック

これにより、より汎用的なコードが可能になります。

  • テンプレート void stdf_transform_every_int_templ(int * v, unsigned const n, std::function fp);
  • template voidtransform_every_int_templ(int * v, unsigned const n, F f);

互換性のあるコールバックの型:

  • 関数ポインタ: 機能ポインター
  • std::function オブジェクト: 関数ポインター、ラムダ式、バインド式、関数オブジェクト
  • テンプレート化されたコールバック: 任意の呼び出し可能な型 (例: 、ラムダ式、バインド式、関数オブジェクト)

例:

  • 関数ポインタの例:

    void tranform_every_int(int * v, unsigned n, int (*fp)(int));
    int double_int(int x) { return 2*x; }
    int square_int(int x) { return x*x; }
    ログイン後にコピー
  • std::functionオブジェクトの例:

    void stdf_tranform_every_int(int * v, unsigned n, std::function<int(int)> fp);
    int a[5] = {1, 2, 3, 4, 5};
    stdf_tranform_every_int(&amp;a[0], 5, Meow{8});
    ログイン後にコピー
  • テンプレート化されたコールバックの例:

    int nine_x_and_y (int x, int y) { return 9*x + y; }
    using std::placeholders::_1;
    stdf_transform_every_int_templ(&amp;a[0], 5, std::bind(nine_x_and_y, _1, 4));
    ログイン後にコピー

以上がコールバックはどのように C コードの機能を強化できるのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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