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

在C++11中,lambda表达式和std::function的结合使用极大地提升了代码的灵活性和可读性。lambda表达式允许你在需要的地方直接定义匿名函数,而std::function提供了一个统一的函数包装器,可以保存、传递任何可调用对象,包括lambda。
std::function 是什么?
std::function 是一个通用的多态函数包装器,定义在
例如:
std::function
立即学习“C++免费学习笔记(深入)”;
这表示 func 可以存储任何接受两个 int 参数并返回 int 的可调用对象。
将 lambda 赋值给 std::function
lambda 表达式生成一个闭包对象,这个对象可以被 std::function 接受,只要它们的调用签名匹配。
示例:
#include
#include iostream>
int main() {
std::function
return a + b;
};
std::cout
return 0;
}
这里,lambda 表达式被赋值给 std::function 对象 add,之后可以像普通函数一样调用。
在函数参数中使用 std::function 和 lambda
这种组合特别适合用于回调机制或策略模式。
比如,定义一个通用的“操作执行”函数:
void perform_operation(std::function
std::cout
op();
std::cout
}
调用时传入不同的 lambda:
perform_operation([]{ std::cout perform_operation([]{ std::cout
这样就实现了行为的动态注入,无需定义多个函数或类。
捕获变量的 lambda 与 std::function
lambda 可以捕获外部变量,std::function 同样能正确持有这些闭包。
例如:
int multiplier = 5;
std::function
return x * multiplier;
};
std::cout
注意:如果 lambda 捕获了局部变量的引用,需确保 std::function 的生命周期不超过所捕获变量的生命周期,否则会引发悬空引用。
基本上就这些。lambda 配合 std::function 让 C++ 的函数式编程风格更自然,也简化了回调、事件处理等场景的实现。不复杂但容易忽略细节,尤其是捕获方式和生命周期管理。










