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 表达式使得定义回调函数更加简洁,不需要额外定义命名的函数。
