Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah Panggilan Balik Boleh Meningkatkan Kefungsian Kod C?

Bagaimanakah Panggilan Balik Boleh Meningkatkan Kefungsian Kod C?

DDD
DDDasal
2024-12-10 18:22:12497semak imbas

How Can Callbacks Enhance C   Code Functionality?

Panggil balik dalam C

Panggil balik ialah objek boleh panggil yang diterima oleh fungsi atau kelas, digunakan untuk menyesuaikan logik semasa berdasarkan panggilan balik.

Bila nak guna Panggilan balik:

  • Menulis kod generik bebas daripada logik fungsi yang dipanggil.
  • Mendayakan gelagat masa jalan dinamik (mis., menukar fungsi butang dalam permainan).
  • Memberitahu pemanggil tentang acara tertentu.

Boleh Dipanggil dalam C 11:

Panggil balik boleh mengambil pelbagai bentuk, semuanya dianggap "boleh dipanggil":

  • Penunjuk fungsi
  • std::objek fungsi
  • Ekspresi Lambda
  • Ikat ungkapan
  • Objek fungsi (kelas dengan operator panggilan fungsi terlampau beban)

Notasi Panggilan Balik:

1. Penunjuk Fungsi

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

2. Penunjuk kepada Fungsi Ahli

  • 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 Objects

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

4. Panggilan Balik Templat

Ini membenarkan lebih banyak kod generik.

  • template void stdf_transform_every_int_templ(int * v, unsigned const n, std::function fp);
  • template void transform_every_int_templ(int * v, unsigned const n, F f);

Jenis Panggilan Balik Serasi:

  • Penunjuk Fungsi: Fungsi penunjuk
  • std::fungsi Objek: Penunjuk fungsi, ungkapan lambda, ungkapan ikatan, objek fungsi
  • Panggil Balik Bertemplat: Sebarang jenis boleh panggil (cth. , ungkapan lambda, ungkapan ikatan, fungsi objek)

Contoh:

  • Contoh Penunjuk Fungsi:

    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 Object Contoh:

    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});
  • Contoh Panggilan Balik Bertemplat:

    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));

Atas ialah kandungan terperinci Bagaimanakah Panggilan Balik Boleh Meningkatkan Kefungsian Kod C?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn