C/C++回调函数
1.基本概念
回调函数:回调函数就是一个通过函数指针调用的函数,即把函数的指针(地址)作为参数传递给另一个函数,当这个指针在特定的事件或条件发生时被另外函数调用,用于对该事件或条件进行响应。
C语言中回调函数依赖函数指针来实现,在C++中引入了 std::function 与 std::bind 来配合进行回调函数实现。
2.C语言中回调函数使用
1)声明一个函数指针类型。
2)定义使用回调函数的函数,将函数指针类型及变量名声明作为参数传递。
3)定义符合函数指针类型的实现函数,将实现函数的指针作为参数传递给使用它的函数。
注意:实现函数的类型必须要和函数指针的类型声明一致,也就是返回值和参数表(个数、类型)要完全一致。
#include
typedef int (*Calc)(int a, int b);//声明函数指针类型
int CalcValue(int a, int b, const Calc &func) //定义调用回调函数的函数,函数指针作为参数
{
return func(a, b);}
int Add(int a, int b) {//定义函数指针类型函数
return a + b;}
int main(){
int a = 4;
int b = 6;
int c = CalcValue(a, b, Add);
std::cout << "Value: " << c << std::endl;
return EXIT_SUCCESS;}
3.C++中回调函数实现
(1)std::function:std::function 是一个模板类。作用是对C++中的可调用对象进行包装,例如普通函数、成员函数、模板函数、静态函数、lambda表达式等。它的最基本的作用是,简化调用的复杂程度,统一调用的方式。如果代码中混杂着大量普通函数、模板函数、lambda,使用 std::function 是非常有必要的。使用方法:
std::function<returnType(argType, argType,…)> func;
std::function<int(int, int)> func;
(2)std::bind:是基于模板的函数,顾明思意它的作用是绑定并返回一个 std::function 对象。作为延迟计算的思想的一种实现,作为一个调用过程当中的转发者而存在,返回一个 std::function 对象。它与 std::function 不同的是,function 是模板类,bind 是模板函数,而 bind 返回的可调用对象可以直接给 function 进行包装并保存。
int Add(int a, int b) {
return a + b;}
/* — 普通函数 — /【伪代码】std::bind(&funcName, std::placeholders::_1, …);
【常规情况】std::bind(&Add, std::placeholders::_1, std::placeholders::_2);
/ — 类成员函数 — */【伪代码】std::bind(&className::funcName, classPtr, std::placeholders::_1, …);
【常规情况】std::bind(&BrainToolBox::Add, brain, std::placeholders::_1, std::placeholders::_2);
当用作普通函数的绑定时,第一个参数是可调用对象(普通函数、lambda等),而第二个参数开始对应可调用对象的参数表。std::placeholders::_1 代表可调用对象的第一个参数,2就代表第二个参数,依此类推。当用作类成员函数的绑定时,第一个参数仍然是作为类成员的可调用对象引用,第二个参数则是对象的指针,而第三个参数开始对应可调用对象的参数表。同样使用 std::placeholders::*依次向后推。所以,与 std::function 相结合,便可以实现对类成员函数的调用:
#include
#include
#include
using namespace std;
class BrainToolBox
{
public:
int Add(int a, int b) { return a + b; };
};
int main()
{
int a = 4;
int b = 6;
std::shared_ptr brain = std::make_shared();
std::function<int(int, int)> addFunc = std::bind(&BrainToolBox::Add, brain, std::placeholders::_1, std::placeholders::_2);
int c = addFunc(a, b);
std::cout << "c Value: " << c << std::endl;
return EXIT_SUCCESS;
}