本帖最后由 dong_abc 于 2013-9-5 22:29 编辑
第7章 为改变思考方式而改变
1、lambda与仿函数
最简单lambda函数这是个函数吗? yes!
int main()
{
int a=1;
int b=2;
auto sum = [=]{return a+b;};
a++; b--;
return sum(a+b);
}
auto sum = [=]{return a+b;}; 是求两个数的和,可以在main函数中直接调用。
lambda函数即局部函数,可以就地调用。
[a]表示以值得方式捕捉变量a ;
auto sum = [a](int b;){return a+b;};
[=]表示以值得方式捕捉所有父作用域的变量(包括this);
auto sum = [=]{return a+b;};
[&i]表示以引用传递的方式捕捉变量i ;
auto sum = [=,&b]{return a+b;};
[&]表示以引用传递的方式捕捉所有父作用域的变量
auto sum = [&]{return a+b;};
[this]表示以值得方式捕捉this指针
//还没想好lambda函数如何利用this指针。
通过组合,lambda函数还能表达更复杂的变量捕捉。
[=,a,&b]表示以值得方式捕捉变量a,以引用的方式捕捉变量b,以值得方式捕捉其他所有父作用域的变量。
auto sum = [=,a,&b](int c){c = a+b;};
lambda函数可以不用声明,在其父作用域内就地调用,通过lambda函数,程序员可以轻松地在函数内部重用代码,而不用费心设计接口。
那个传说中的“为任何可重用的代码创建函数”的作风,因lambda局部函数的出现而更理性的思考。
未完,待续... |