Melalui Panggilan Balik Antara Kelas Heterogen
Dalam C , menentukan panggilan balik yang boleh dikongsi antara pelbagai kelas boleh menimbulkan cabaran. Walaupun menyediakan fungsi ahli statik dan menghantar penuding kepada contoh kelas adalah pendekatan biasa, ia mengehadkan fleksibiliti. Begini cara untuk menangani isu ini menggunakan std::function dan std::bind C 11:
Refactoring EventHandler
Daripada kaedah statik dan petunjuk contoh, refactor EventHandler untuk menerima std::function:
class EventHandler { public: void addHandler(std::function<void(int)> callback) { // ... (as above) } };
Fungsi ini menerima "objek fungsi" yang mengambil hujah integer dan tidak mengembalikan apa-apa.
Menyesuaikan MyClass
Ubah suai MyClass untuk mengalih keluar kata kunci statik daripada Panggil Balik dan sebaliknya memberikan hujah:
class MyClass { public: void Callback(int x); // ... }; MyClass::Callback(int x) { // ... (as above) }
Untuk mengikat Panggil Balik ke EventHandler, gunakan std::bind:
handler->addHandler(std::bind(&MyClass::Callback, this, std::placeholders::_1));
Pemegang tempat _1 mewakili hujah tunggal.
Fungsi Kendiri dan Ungkapan Lambda
Anda boleh menggunakan fungsi kendiri terus dalam addHandler:
void freeStandingCallback(int x) { // ... } handler->addHandler(freeStandingCallback);
Selain itu, ungkapan lambda C 11 boleh digunakan dalam addHandler:
handler->addHandler([](int x) { std::cout << "x is " << x << '\n'; });
Kesimpulan
Dengan menggaji std::function dan std::bind, panggilan balik boleh dihantar dengan lancar antara kelas heterogen, memberikan fleksibiliti dan kebolehgunaan semula kod.
Atas ialah kandungan terperinci Bagaimanakah `std::function` dan `std::bind` C 11 Boleh Menyelesaikan Cabaran Panggilan Balik Kelas Heterogen?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!