前言
在 C++11 标准中,简化代码编写与统一可调用对象管理是两大核心目标。Lambda 表达式解决了传统仿函数定义繁琐的问题;可变参数模板打破了模板参数数量限制;function 包装器与 bind 函数整合了函数指针、仿函数及 Lambda 等可调用对象,实现了统一管理。
Lambda 表达式
Lambda 表达式是局部的匿名函数对象,底层基于仿函数实现。不同 Lambda 即使结构相同也不是同一类型,不能相互赋值。
语法格式
[捕获列表](参数列表)(mutable)-> 返回值类型 { 函数体 };
- 捕获列表:
[var]:值传递捕捉变量 var。[=]:值传递捕获所有父作用域变量(包括 this)。[&var]:引用传递捕捉变量 var。[&]:引用传递捕获所有父作用域变量(包括 this)。- 注意:不允许变量重复捕获,如
[=,a]会报错。
- mutable:取消捕获列表内变量的 const 性,但参数列表不可省略。
- 返回值类型:通常由编译器推导,可不写。
用法示例
// 存储到容器中
vector<function<double(double)>> v = {
f,
[](double d) -> double { return d / 4; },
Functor()
};
可变参数模板
可变参数模板允许模板参数为不确定数目。
展开参数包的方法
- 递归展开。
- 逗号表达式展开。
应用示例
template<class... Args>
Date* Create(Args... args) {
Date* ret = new Date(args...);
return ret;
}
// 使用
Date* p1 = Create(2025, 9, 7);
emplace_back 支持可变参数模板,可直接传零散参数;push_back 需先构造临时对象。


