C++11新特性(1)——Lambda
如果代码里面存在大量的小函数,而这些函数一般只被一两处调用,那么不妨将它们重构成Lambda表达式,也就是匿名函数。作用就是当你想用一个函数,但是又不想费神去命名一个函数。
Lambda与仿函数
Lambda的本质是一个特殊的,匿名的类类型。他是一个带有operator()的类,即仿函数。
仿函数
仿函数(functor),就是使一个类的使用看上去像一个函数。其实现就是类中实现一个operator(),这个类就有了类似函数的行为,就是一个仿函数类了。但注意仿函数不是函数而是类,他是通过重载了()运算符而拥有函数的行为
基本用法
- 通过类实现加法
class AddNum{
public:
AddNum(int num) : num_(num) {};
int addNum(int x) const{
return num_ + x;
}
private:
int num_;
}
// 调用
auto add_num = AddNum(10);
auto x = add_num.addNum(5);
- 仿函数实现:
class AddNum{
public:
AddNum(int num) : num_(num) {};
int operator()(int x) const{
return num_ + x;
}
private:
int num_;
}
// 调用
auto add_num = AddNum(10);
auto x = add_num(5);
Lambda函数用法
- 基本用法:
[capture](params)->ret {body};
- [capture]指定在可见域范围内lambda表达式代码内可见的参数。
- [] 不捕获任何变量。
- [&] 捕获外部作用域中所有变量,并作为引用在函数体中使用(按引用捕获)。
- [=] 捕获外部作用域中所有变量,并作为副本copy在函数体中使用(按值捕获)。
- [=,&foo] 按值捕获外部作用域中所有变量,并按引用捕获 foo 变量。
- [bar]按值捕获 bar 变量,同时不捕获其他变量。
- [this] 捕获当前类中的 this 指针,让 lambda 表达式拥有和当前类成员函数同样的访问权限。如果已经使用了 & 或者 =,就默认添加此选项。捕获 this 的目的是可以在 lamda 中使用当前类的成员函数和成员变量。
- (params)指定lambda表达式内部变量定义。
- ->ret是返回类型,如果 lambda 代码块中包含了 return 语句,则该 lambda 表达式的返回类型由 return 语句的返回类型确定。如果没有 return 语句,则类似 void f(…) 函数。
- {body}是Lambda表达式主题结构。
- 示例
auto add_num2 = [lambda_num = 10](int x){return lambda_num + x};
auto lambda x = add_num2(5);