一、背景
回调在我们开发的过程种使用的频率非常之高。甚至有这样一种说法,开发者会不会使用回调直接就能看出这个人的开发能力,回调的使用几乎会存在任何的项目中。最近在用C++开发项目刚好要用到回调,等到需要使用的时候才发现和C语言的回调使用方式完全不是一回事(以前主要写C),也是查找了一番资料才慢慢搞懂C++回调的一些常用用法。在此做一个简要的总结记录,避免日后忘记后有个可以翻阅的地方,也和各位码友分享,有不足之处欢迎在评论区批评指正,一起成长!废话不多说,直接进入主题吧。
二、为什么要用回调
在回答为什么要用回调函数之前,我们先弄清楚什么是回调函数。官方解释是这么说的:回调函数就是通过一个函数指针调用的函数。函数实现者并不调用,是等待某一个事件触发的时候才会在另外一个模块被调用。经常我们需要将事件或者业务流程和结果分开处理,这时候就要可以实现传一个函数指针到业务模块中去,等到需要结果的时候业务模块就会调用这个函数指针将结果返回到主模块,这样就实现了一个被动通知的效果,而不需要一直去查询结果。很多的notify机制就是通过函数指针实现的。还有一种需要实现兼容操作的时候也可以回调实现,比如linux系统中的驱动代码框架需要兼容各种厂家和型号的芯片,就是通过回调注册的机制来实现高度抽象分离的,回调函数就是实现各自的芯片驱动逻辑,上层框架就是通过调用函数指针来实现业务逻辑,做到解耦分离。
三、回调的实现方式
清楚了回调函数的定义和为什么需要使用回调机制后,现在就来谈谈回调的实现方式。如果是C语言,回调的实现方式就比较简单,只需要声明一个函数指针,然后将这个函数指针当作形参传过去即可,这里不做详细展开讨论了,有兴趣的小伙伴可以去网上搜一下c语言回调函数的实现方式。但是C++中的回调实现就五花八门,各式各样了,这里整理了几种常见的实现方式。如有不全面或者不妥之处欢迎评论区指出,不胜感激,一起进步。
3-1:std::function和std::bind方式
std::function 是C++11标准中的一种类型,可以通过这个类型来实现C++中高阶函数的概念。std::function的功能非常强大而且灵活,这里只是借用它的功能来实现一个C++中的回调机制。定义std::function 的方式:“std::function 返回类型<参数类型列表> 函数名”,例如要定义一个std::function 名为add,接受两个int型参数,返回一个int值的函数变量。可以按这样定义:std::function int <int, int> add ; 下面我们就用一个小例子来说明std::function的用法。
#include <iostream>
#include <functional>
using namespace std;
int add(int a, int b)
{
return (a+b);
}
int main()
{
std::function<int (int, int)> addFun = add; //定义一个add