文章目录
前言
在C++的开发过程中,回调作为控制业务逻辑的常用手段,应用较多。讲解了回调函数的基本概念及应用关键点、C++可调用对象的概念及对应类型举例、C++常用函数转换方式、C风格回调函数应用。
一、回调函数
1. 定义
回调函数是一个具有特定签名(参数列表和返回类型)的函数,不接受任何额外的上下文信息,可以作为参数传递到另一个函数中,并在需要时被调用。C++静态函数或非成员函数可以满足这种函数签名的要求。
2. 关键点
- 确定的函数地址:不依赖具体的实例;
- 特定的函数签名:不接受任何额外的上下文信息;
二、可调用对象
1.定义
可调用对象是一个更广泛的概念,它可以是函数指针、函数对象、成员函数指针、成员函数对象、Lambda表达式等。可调用对象可以像函数一样被调用,因此可以将其作为参数传递给另一个函数,以实现回调的功能。
2. 类型
- 函数指针
- 仿函数
- 类对象转换为函数指针
- 类成员函数
- 类成员
代码示例[^1]:
void func(void){
//...
}
struct Foo{
void operator()(void){
//...
}
};
struct Bar{
using fr_t = void(*)(void);
static void func(void){
//...
}
operator fr_t(void){
return func;
}
};
struct A{
int a;
void memFunc(void){
//...
}
};
int main(){
//函数指针
void (*funcPtr)(void) = &func;
funcPtr();
//仿函数
Foo foo;
foo();
//类对象转换为函数指针
Bar bar;
bar();
//类成员及成员函数
void (A::*memFuncPtr)(void) = &A::memFunc;
int A::*memObjPtr = &A::a;
A a;
(a.*memFuncPtr)();
(a.*memObjPtr) = 1;
return 0;
}
三、可调用对象包装器、绑定器、lambda表达式
1. 包装器 std::function
std::function 是 C++ 标准库中的一个多态函数对象封装器,它可以用于存储、复制和调用任意可调用对象(函数、函数对象、成员函数指针、Lambda 表达式等),提供了一种通用的方式来处理函数对象,而不必关心具体的类型,像普通函数一样进行调用。
2. 绑定器 std::bind
std::bind 是 C++ 标准库中的一个函数模板,用于将可调用