回调函数基本实现
回调函数(Callback Function)是一段可以在将来某个时间点被调用的代码。
它通常作为参数传递给另一个函数(称为高阶函数或接受函数),并在需要的时候(比如某个操作完成或事件发生时)由那个函数来调用。
基本思想:“不要返回我结果,当你有结果时,请调用这个函数,并将结果作为参数传递给它。”
回调函数的作用
- 异步编程:在需要等待的操作(如文件读写、网络请求等)完成时,回调函数允许程序继续执行其他任务,而不是阻塞等待。当操作完成时,回调函数被调用,处理结果。
- 事件监听:在图形用户界面(GUI)编程、网络编程等领域,当发生特定事件(如用户点击按钮、接收到网络消息等)时,可以注册回调函数来响应这些事件。
使用步骤
- 定义回调函数类型:首先,你需要定义一个函数指针类型,该类型与你的回调函数签名相匹配。或者,你可以使用std::function,它提供了更灵活的方式来存储和调用可调用对象(包括函数、lambda表达式、bind表达式等)。
- 实现回调函数:然后,你需要实现一个或多个符合上述类型的函数作为回调函数。
- 编写接受回调作为参数的函数:接下来,编写一个函数,该函数接受一个回调函数作为参数,并在适当的时候调用它。
- 调用包含回调的函数:最后,将你的回调函数作为参数传递给那个函数,并在回调函数被调用时查看结果。
代码示例:
使用函数指针实现回调
#include <iostream>
// 步骤1: 定义回调函数类型
typedef void (*Callback)(int);
// 步骤2: 实现回调函数
void myCallback(int value) {
std::cout << "Callback called with value: " << value << std::endl;
}
// 步骤3: 编写接受回调作为参数的函数
void doSomething(Callback cb, int value) {
// ... 这里可以执行一些操作 ...
// 调用回调函数
cb(value);
}
int main() {
// 步骤4: 调用包含回调的函数
doSomething(myCallback, 10);
return 0;
}
使用std::function实现
#include <iostream>
#include <functional>
// 步骤1: (隐式地)定义回调函数类型
// 这里不需要显式定义,因为std::function可以接受多种可调用对象
// 步骤2: 实现回调函数
void myCallback(int value) {
std::cout << "Callback called with value: " << value << std::endl;
}
// 也可以直接使用lambda表达式作为回调函数
auto lambdaCallback = [](int value) {
std::cout << "Lambda callback called with value: " << value << std::endl;
};
// 步骤3: 编写接受回调作为参数的函数
void doSomething(std::function<void(int)> cb, int value) {
// ... 这里可以执行一些操作 ...
// 调用回调函数
cb(value);
}
int main() {
// 步骤4: 调用包含回调的函数
doSomething(myCallback, 20);
doSomething(lambdaCallback, 30);
return 0;
}