typedef std::function与bind,placeholder

回调函数

参考关于C++ 回调函数(callback) 精简且实用_c++ callback-CSDN博客

回调函数不是在函数的定义上区别于普通函数,而是在调用的方式有区别,因为归根到底,他们都是代码中芸芸众生的普普通通的函数,即“回调函数”的重点在“回调”这两个字。

下图列举了普通函数执行和回调函数调用的区别。

  • 对于普通函数,就是按照实现设定的逻辑和顺序执行。
  • 对于回调函数,假设Program A和Program B分别有两个人独立开发。回调函数Fun A2它是由Program A定义,但是由Program B调用。Program B只负责取调用Fun A2,但是不管Fun A2函数具体的功能实现。

因为有这样的使用场景,Fun A2只有在 Fun B1调用时才能执行,有点像中断函数的概念。那可能会有人问,在Program A中不断去查询Fun B1的状态,一旦它被执行了,就让Program A自己去执行Fun A2不行吗?
答案是“可以”,但是这样实现的方案不好。因为整个过程中Program A一直都在查询状态,非常耗资源,查询频率高了费CPU,查询频率低了实时性保证不了,Fun B1都执行好久了你才反应过来,Fun A2的执行就会明显晚于Fun B1了。正因为如此,回调函数才登上了舞台。

如何实现函数回调

函数的回调并不复杂,把 Fun A2的函数的地址/指针告诉Program B就可以了。
其实我们在这里要讨论的是在C++中,常用回调函数的类型。

得到函数的地址是其中一个关键步骤。
普通和函数和类的静态成员函数都分配有确定的函数地址,但是类的非静态函数(即普通函数)是类共用的,并不会给类的每一个实例都分配一个独立的成员函数,这样就太浪费存储资源了。所以类的非静态函数作为回调函数是有区别的,也是这篇文章想要讨论的重点。

使用`typedef`定义的`std::function`变量的类型取决于`std::function`模板参数的指定。`std::function`是一个函数模板类,可用于定义不同类型的对象,这些对象的类型可以是普通函数、静态函数以及Lambda表达式等可调用对象[^1]。 `std::function`通过指定其模板参数,用统一的方式处理函数、函数对象、函数指针,并允许保存和延迟执行它们。例如,`typedef std::function<void(void *event)> FunInputEvent;` 中,`FunInputEvent`类型实际上是一个`std::function`对象,其模板参数指定为`void(void *event)`,这意味着`FunInputEvent`类型的变量可以存储任何接受一个`void *`类型参数并且返回`void`的可调用对象,包括普通函数、静态成员函数、仿函数、Lambda表达式等[^2][^4]。 下面是一个简单的示例代码来进一步说明: ```cpp #include <iostream> #include <functional> // 定义一个接受void*参数且返回void的普通函数 void testFunction(void *event) { std::cout << "testFunction called" << std::endl; } // 使用typedef定义std::function类型 typedef std::function<void(void *event)> FunInputEvent; int main() { // 创建一个FunInputEvent类型的对象,并绑定普通函数 FunInputEvent eventHandler = testFunction; void *dummyEvent = nullptr; // 调用存储的可调用对象 eventHandler(dummyEvent); return 0; } ``` 在上述代码中,`FunInputEvent`类型的变量`eventHandler`可以存储`testFunction`这样的普通函数,并且可以像调用普通函数一样调用存储在其中的可调用对象。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值