学习 c++11 之 Lambda表达式
作者:
| 更新日期:快来学习c++新功能 Lambda表达式 吧。
本文首发于公众号:天空的代码世界,微信号:tiankonguse
零、背景
之前提到,我们开始从 c98 切换到 c++11 了。
所以我打算分一个系列来介绍常见的 c++11 的语法。
今天要分享的第二个知识点我在比赛中也经常用到,就是匿名函数 Lambda表达式 。
比如上次的《第 15 场双周赛回顾》,sort 排序的比较函数我就用到了 Lambda表达式。
一、旧的方式
以前的时候,对于排序的比较函数只能写一个 cmp 函数。
这个 cmp 函数只会在这个一个场景使用,但是由于语言旧语法的限制,只能定义一个全局函数。
如果需要的 cmp 函数多了,就显得很乱。
二、新的方式
C++11 的语言里,引入了传说中的 Lambda 表达式,其实就是匿名函数。
大概如法是:
[capture list] (parameter list) ->return type {
function body
}
第一个方括号是闭包的特性,用于传入一些匿名函数可以使用的外部变量。
大概分几类:
1、[]
不使用任何外部变量
2、[&]
所有变量都以引用形式使用
3、[=]
所有变量都以传值形式使用
4、[x, &y]
x 以传值形式使用,y 以引用形式使用。
5、[&, x]
x 以传值形式使用,其他的以引用形式使用。
6、[=, &z]
z 以引用形式使用,其他的以传值形式使用。
7、[=, x, &y]
可以传入更多的参数
这样,我们就可以愉快的写匿名函数了。
三、应用
工作上,我们用到了协程。
协程的每个并发都需要按照框架的形式实现一个子类,并实现一个虚函数。
这个虚函数内可以进行网络操作。
这样封装之后,就可以并发的对外请求了。
简化后的代码大概如下:
如上图,由于是并发,请求的处理逻辑分成了两部分,并发逻辑一多,将会非常混乱,不容易管理。
而使用 lambda 函数封装,则简单多了。
这时候,只需要在一个匿名函数里面以同步的方式写整个代码逻辑即可。
四、最后
lambda 表达式挺有用的,这里举了两个场景。
你在什么场景使用 lambda 呢?
-EOF-
本文公众号:天空的代码世界
个人微信号:tiankonguse
公众号ID:tiankonguse-code
本文首发于公众号:天空的代码世界,微信号:tiankonguse
如果你想留言,可以在微信里面关注公众号进行留言。