首页 > 后端开发 > C++ > 如何使用类成员和 `std::function` 实现通用 C 回调?

如何使用类成员和 `std::function` 实现通用 C 回调?

Patricia Arquette
发布: 2024-12-07 18:56:18
原创
503 人浏览过

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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板