C/C++有几种实现函数回调的方式,并给出具体的实现例子
时间: 2024-03-07 18:50:04 浏览: 63
C/C++有多种实现函数回调的方式,以下列举其中的三种实现方式:
1. 函数指针实现回调
函数指针是指向函数的指针变量,可以用来调用函数。通过定义一个函数指针,然后把它作为参数传递给另一个函数,就可以实现回调。例如:
```c
#include <stdio.h>
void callback(int num) {
printf("Callback called with %d\n", num);
}
void caller(void (*func)(int)) {
func(42);
}
int main() {
caller(callback);
return 0;
}
```
这段代码中,我们定义了一个函数指针 `void (*func)(int)`,它可以指向任意一个以 `int` 为参数、返回值为 `void` 的函数。在 `caller` 函数中,我们把函数指针作为参数传递给另一个函数,并在该函数中调用了这个函数指针,这样就完成了回调。
2. 函数对象实现回调
函数对象是一个具有函数调用运算符的类对象,可以像函数一样被调用。通过定义一个函数对象,然后把它作为参数传递给另一个函数,就可以实现回调。例如:
```c++
#include <iostream>
class Callback {
public:
void operator()(int num) {
std::cout << "Callback called with " << num << std::endl;
}
};
void caller(Callback func) {
func(42);
}
int main() {
Callback callback;
caller(callback);
return 0;
}
```
这段代码中,我们定义了一个函数对象 `Callback`,它重载了函数调用运算符 `operator()(int)`,因此可以像函数一样被调用。在 `caller` 函数中,我们把函数对象作为参数传递给另一个函数,并在该函数中调用了这个函数对象,这样就完成了回调。
3. Lambda表达式实现回调
Lambda表达式是C++11引入的一种新语法,可以用来定义匿名函数对象。通过定义一个Lambda表达式,然后把它作为参数传递给另一个函数,就可以实现回调。例如:
```c++
#include <iostream>
void caller(std::function<void(int)> func) {
func(42);
}
int main() {
auto callback = [](int num) {
std::cout << "Callback called with " << num << std::endl;
};
caller(callback);
return 0;
}
```
这段代码中,我们定义了一个Lambda表达式 `[](int num){...}`,它可以作为一个函数对象被调用。在 `caller` 函数中,我们把Lambda表达式作为参数传递给另一个函数,并在该函数中调用了这个Lambda表达式,这样就完成了回调。需要注意的是,使用Lambda表达式需要包含头文件 `<functional>`。
阅读全文