不帶類別成員函數的C 語言回調機制
回調函數提供了一種註冊函數的方法,以便在特定事件發生時調用該函數。雖然使用靜態方法並將類別實例作為參數傳遞是一種常見方法,但它限制了跨不同類別使用回調的靈活性。
C 11 及其他版本中的std::function 和std::bind
C 11 引入了std::function,一個函數指標的型別安全包裝函數器。這允許回調存儲為對象,獨立於它們引用的類別。此外,std::bind 用於將函數綁定到特定物件及其參數。
讓我們考慮一個範例事件處理程序類,EventHandler:
class EventHandler { public: void addHandler(std::function<void(int)> callback) { cout << "Handler added..." << endl; callback(1); // trigger the event } };
現在,MyClass 和YourClass都可以透過實作自己的回呼函數並使用註冊它們來使用此事件處理程序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 } };
Lambda 函數和EventHandler
此外,C 11 引入了 lambda 函數,提供了一種簡潔、簡單的方法來定義匿名函數。它們可以與事件處理程序一起使用來創建高度可自訂的回調:
handler->addHandler([](int x) { cout << "Lambda callback executed with x: " << x << endl; });
這允許更靈活地定義回調並將它們與特定的類別方法解耦。
以上是C如何在不依賴類別成員函數的情況下實現靈活的回呼機制?的詳細內容。更多資訊請關注PHP中文網其他相關文章!