Mekanisme Panggilan Balik dalam C tanpa Fungsi Ahli Kelas
Fungsi panggil balik menyediakan cara untuk mendaftarkan fungsi yang akan digunakan apabila acara tertentu berlaku. Semasa menggunakan kaedah statik dan lulus contoh kelas sebagai parameter ialah pendekatan biasa, ia mengehadkan fleksibiliti menggunakan panggilan balik merentas kelas yang berbeza.
std::function dan std::bind dalam C 11 dan Beyond
C 11 memperkenalkan fungsi std::, pembungkus selamat jenis untuk penunjuk fungsi. Ini membolehkan panggilan balik disimpan sebagai objek, bebas daripada kelas yang mereka rujuk. Selain itu, std::bind digunakan untuk mengikat fungsi pada objek tertentu dan hujahnya.
Mari kita pertimbangkan contoh kelas pengendali acara, EventHandler:
class EventHandler { public: void addHandler(std::function<void(int)> callback) { cout << "Handler added..." << endl; callback(1); // trigger the event } };
Sekarang, MyClass dan YourClass kedua-duanya boleh menggunakan pengendali acara ini dengan melaksanakan fungsi Panggilan Balik mereka sendiri dan mendaftarkannya menggunakan 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 } };
Fungsi Lambda dan EventHandler
Selain itu, C 11 memperkenalkan fungsi lambda, menyediakan cara ringkas dan mudah untuk mentakrifkan fungsi tanpa nama. Ia boleh digunakan dengan pengendali acara untuk membuat panggilan balik yang sangat boleh disesuaikan:
handler->addHandler([](int x) { cout << "Lambda callback executed with x: " << x << endl; });
Ini membolehkan lebih fleksibiliti dalam menentukan panggilan balik dan memisahkannya daripada kaedah kelas tertentu.
Atas ialah kandungan terperinci Bagaimanakah C Boleh Mencapai Mekanisme Panggilan Balik Fleksibel Tanpa Bergantung pada Fungsi Ahli Kelas?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!