C++11 引入的 std::function
和 Lambda 表达式来实现回调函数。这种方式比传统的函数指针更加灵活,因为它不仅能传递普通函数,还能传递匿名函数(Lambda)和类成员函数。下面我们详细解释这一实现方式的执行过程。
1.代码实现
#include <iostream>
#include <functional>void perform_Action(std::function<void(int)> callback, int value) {callback(value);
}int main() {perform_Action([](int x) {std::cout << "Lambda callback with value: " << x << std::endl;}, 10);return 0;
}
2.详细解释
(1)使用 std::function
来存储回调函数
首先定义了一个 perform_Action
函数。这里不再使用函数指针,而是使用 std::function
来存储回调函数。
void perform_Action(std::function<void(int)> callback, int value) {callback(value);
}
std::function<void(int)>
是一个通用的函数包装器,它可以存储任何符合void(int)
签名的可调用对象,包括普通函数、Lambda 表达式、类的成员函数等。callback
是传入的回调函数的包装,它是一个std::function
类型的对象。value
是传入的整数参数,当回调函数被调用时会传递给它。
(2)Lambda 表达式定义回调函数
在 main
函数中,我们使用 Lambda 表达式定义了一个匿名回调函数:
perform_Action([](int x) {std::cout << "Lambda callback with value: " << x << std::endl;
}, 10);
[]
:表示这是一个 Lambda 表达式的开始。(int x)
:Lambda 表达式的参数,这里指定了它接受一个int
类型的参数。{ std::cout << "Lambda callback with value: " << x << std::endl; }
:这是 Lambda 表达式的主体部分,当 Lambda 被调用时,这段代码将会执行。它会输出"Lambda callback with value: "
和传递给它的x
值。
这段代码的作用是:当 perform_Action
调用这个 Lambda 时,它会输出传递给它的 int
参数。由于这里传递的是 10
,最终将会输出 "Lambda callback with value: 10";
(3)在 main
中调用 perform_Action
在 main
函数中,perform_Action
被调用并传入两个参数:
- 一个 Lambda 表达式,它是回调函数。
- 一个整数
10
,将会传递给回调函数。
这意味着当 performAction
执行时,会调用传入的 Lambda 表达式,并将 10
作为参数传递给它。
(4)performAction
内部调用回调函数
进入 performAction
函数后,以下代码执行:
callback(value);
callback
是一个std::function<void(int)>
对象,指向 Lambda 表达式。callback(value)
实际上是调用 Lambda 表达式并将value
(也就是10
)作为参数传递给它。
3.执行流程
(1)在 main
函数中调用 performAction
,并将一个 Lambda 表达式和 10
作为参数传递。
(2)performAction
内部通过 callback(value)
调用回调函数,这个回调函数是一个 Lambda 表达式。
(3)Lambda 表达式执行时,接受参数 10
并输出 "Lambda callback with value: 10"
。
(4)程序完成执行,退出。
4.优点
- 灵活性高:
std::function
可以接受各种形式的可调用对象,如普通函数、Lambda 表达式、函数对象(仿函数)和类成员函数。 - 类型安全:使用
std::function
提供了更好的类型安全,防止出现函数指针类型不匹配的问题。 - 简洁:Lambda 表达式使得定义回调函数更加简洁,不需要额外定义命名的函数。