首頁 >後端開發 >C++ >如何使用類別成員和 `std::function` 實現通用 C 回呼?

如何使用類別成員和 `std::function` 實現通用 C 回呼?

Patricia Arquette
Patricia Arquette原創
2024-12-07 18:56:18485瀏覽

How to Implement Generic C   Callbacks Using Class Members and `std::function`?

使用類別成員進行通用實現的C 回調

最初的問題旨在創建一個通用的事件處理機制,該機制可以在不同的類別中一致地工作。可以使用 std::function 和 std::bind 使用更現代的 C 方法,而不是依賴靜態方法和傳遞類別實例指標。

有 std::function

事件處理程序類別現在接受 std::function 物件作為參數。函數物件表示可以像常規函數指標一樣傳遞的可呼叫實體。事件處理程序方法 addHandler 採用 std::function 。作為參數,其中傳遞的函數沒有傳回值,並採用整數作為參數。

class EventHandler
{
public:
    void addHandler(std::function<void(int)> callback)
    {
        cout << "Handler added..." << endl;
        // Let's pretend an event just occured
        callback(1);
    }
};
綁定特定函數

要將特定的類別方法綁定到事件處理程序,std使用::bind。 std::bind 指定 this 指標以及事件觸發時要呼叫的函數。

class MyClass
{
public:
    MyClass();

    // Note: No longer marked `static`, and only takes the actual argument
    void Callback(int x);
private:
    int private_x;
};

MyClass::MyClass()
{
    using namespace std::placeholders; // for `_1`

    private_x = 5;
    handler->addHandler(std::bind(&MyClass::Callback, this, _1));
}

void MyClass::Callback(int x)
{
    // No longer needs an explicit `instance` argument,
    // as `this` is set up properly
    cout << x + private_x << endl;
}
獨立函數和 Lambda 函數

如果回呼是獨立函數沒有類別上下文的函數,不需要 std::bind。

void freeStandingCallback(int x)
{
    // ...
}

int main()
{
    // ...
    handler->addHandler(freeStandingCallback);
}
對於匿名回調,lambda 函數可以與事件處理程序。

handler->addHandler([](int x) { std::cout << "x is " << x << '\n'; });
透過這種方式,使用 std::function 和 std::bind 為回調提供了靈活且通用的解決方案,可以應用於不同的類別和函數。

以上是如何使用類別成員和 `std::function` 實現通用 C 回呼?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn