学习 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
如果你想留言,可以在微信里面关注公众号进行留言。

关注公众号,接收最新消息

tiankonguse +
穿越