std::function是<functional>中的通用函数包装器,可存储、传递lambda等可调用对象;示例中将其与lambda结合用于回调和捕获变量,提升代码灵活性与可读性,但需注意捕获引用时的生命周期管理。

在C++11中,lambda表达式和std::function的结合使用极大地提升了代码的灵活性和可读性。lambda表达式允许你在需要的地方直接定义匿名函数,而std::function提供了一个统一的函数包装器,可以保存、传递任何可调用对象,包括lambda。
std::function 是一个通用的多态函数包装器,定义在 <functional> 头文件中。它可以封装普通函数、函数指针、函数对象、lambda 表达式等任何符合调用签名的对象。
例如:
std::function<int(int, int)> func;
立即学习“C++免费学习笔记(深入)”;
这表示 func 可以存储任何接受两个 int 参数并返回 int 的可调用对象。
lambda 表达式生成一个闭包对象,这个对象可以被 std::function 接受,只要它们的调用签名匹配。
示例:
#include <functional>
#include <iostream>
int main() {
std::function<int(int, int)> add = [](int a, int b) {
return a + b;
};
std::cout << add(3, 4) << std::endl; // 输出 7
return 0;
}
这里,lambda 表达式被赋值给 std::function 对象 add,之后可以像普通函数一样调用。
这种组合特别适合用于回调机制或策略模式。
比如,定义一个通用的“操作执行”函数:
void perform_operation(std::function<void()> op) {
std::cout << "开始执行操作..." << std::endl;
op();
std::cout << "操作完成。" << std::endl;
}
调用时传入不同的 lambda:
perform_operation([]{ std::cout << "发送网络请求"; });
perform_operation([]{ std::cout << "保存文件到磁盘"; });
这样就实现了行为的动态注入,无需定义多个函数或类。
lambda 可以捕获外部变量,std::function 同样能正确持有这些闭包。
例如:
int multiplier = 5;
std::function<int(int)> multiply = [multiplier](int x) {
return x * multiplier;
};
std::cout << multiply(3) << std::endl; // 输出 15
注意:如果 lambda 捕获了局部变量的引用,需确保 std::function 的生命周期不超过所捕获变量的生命周期,否则会引发悬空引用。
基本上就这些。lambda 配合 std::function 让 C++ 的函数式编程风格更自然,也简化了回调、事件处理等场景的实现。不复杂但容易忽略细节,尤其是捕获方式和生命周期管理。
以上就是C++11 lambda表达式与std::function结合使用的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号