为什么要使用Lambda表达式?
- 1.可以在某个函数的函数体内直接定义,省了一步在外面定义函数的操作;
- 2.作为函数的参数,类似(可能就是)回调函数的作用。
1.可以在某个函数的函数体内直接定义,省了一步在外面定义函数的操作
Lambda
表达式就是匿名函数,他可以用在某个函数内部,使用lambda
表达式定义一个匿名函数,就像是一个正常的c++
语句一样,不需要额外定义一个函数。
一般情况下,这个lambda
表达式的函数体比较短小,不要写的太复杂;另外,lambda
表达式函数体内也可以调用某个函数,他和正常函数没什么两样,正常函数怎么用,lambda
表达式就能怎么用。
如:
int func(){
auto lambda_func = [](int x)-> int { return x*x; };
int ret=lambda_func(10); //调用匿名函数
return ret;
}
-> int
是指定函数返回值类型为int
,某些情况下可以省略,如,当返回值为void
或者函数体中只有一处 return
的地方(此时编译器可以自动推断出返回值类型)。
2.作为函数的参数,类似回调函数的作用
当一个函数func
的参数是lambda表达式时,基本上就能确定,该函数func
的这个参数是一个回调函数的地址,在该函数内部会把这个lambda表达式赋值给这个形参,在内部进行调用。对于回调函数的知识如果不懂,可以参考函数指针和回调函数的博客原文链接:回调函数、注册回调函数,其实就是晚绑定。
auto lambda_func = [](int x) { return x*x; };
typedef void (*func_ptr)(int);
int func(func_ptr){
func_ptr= lambda_func;
func_ptr(10); // calls the lambda
}
类似的,还可以在多线程时使用。如:
std::thread([this](){Process();});
上面这句话把一个复杂的函数Process()
放到lambda表达式
的函数体内部,就可以将这个lambda表达式
作为参数传入std::thread
。
另外,也可以像下面直接这么用,但是下面单纯为了展示这用法而这么用,没什么意思:
auto lambda_func = [](int x) {return x*x;};
void (*func_ptr)(int) = lambda_func;
func_ptr(10); // calls the lambda