11 lambda 函数
lambda函数语法定义
[capture](parameters) mutable ->return -type {statement}
- [capture] : 捕捉列表
[]是lambda引出符,用于编译器识别lambda函数,捕捉列表可以捕捉上下文中变量以提供lambda函数使用(lambda函数与普通函数最大区别之一,就是lambda函数可以通过捕获列表访问一些上下文中的数据) - (parameters) : 参数列表
与普通函数的参数列表一致,不需要参数传递时可以连同()一起省略 - mutable : mutable修饰符
默认情况,lambda函数是一个const函数,mutable可以取消其常量性。注意:在使用该修饰符时,参数列不可以被省略(及时参数为空) - ->return -type : 返回类型
用追踪返回类型形式声明函数的返回类型,通常省略,让编译器对返回类型进行推导 - {statement} : 函数体
内容与普通函数的函数体一样,不过除了可以用参数之外,还可以使用所有捕获的变量
捕获列表
捕获列表由多个捕获项组成,并以逗号分隔
- [var] 值传递方式捕捉变量
- [=] 值传递方式捕捉所有父作用域的变量(包括this)
- [&var] 引用传递捕捉变量var
- [&] 引用传递捕捉所有父作用域的变量(包括this)
- [this] 值传递方式捕捉当前的this指针
上述捕捉项还可以通过一些组合,表示更复杂的意思,但是不允许变量重复传递
lambda与仿函数
仿函数:简单的说就是重定义了成员函数operator()的一种自定义类型对象。这样的对象有个特点,就是其使用在代码层面感觉跟函数的使用并无二样,但究其本质却并非函数
相比于函数,仿函数可以拥有初始状态,一般通过class定义私有成员,并在声明对象的时候对其进行初始化
#include <iostream>
using namespace std;
class Tax
{
public:
Tax(float r, int b)
:rate(r), base(b){}
float operator() (float money)
{
return (money - base) * rate;
}
private:
float rate;
int base;
};
int main()
{
Tax high(0.4, 30000); //声明时初始化私有成员
Tax middle(0.25, 20000);
cout << "tax over 3w:" << high(37500) << endl;
cout << "tax over 2w:" << middle(25000) << endl;
system("pause");
return 0;
}
lambda函数的本质就是匿名的仿函数,仿函数是编译器实现lambda的一种方式
#include <iostream>
using namespace std;
int main()
{
float highRate = 0.4;
int highBase = 30000;
auto high = [highRate, highBase](float money) {return (money - highBase) * highRate; };
float middleRate = 0.25;
int middleBase = 20000;
auto middle = [middleRate, middleBase](float money) {return (money - middleBase) * middleRate; };
cout << "tax over 3w:" << high(37500) << endl;
cout << "tax over 2w:" << middle(25000) << endl;
system("pause");
return 0;
}