软件特攻队Lambda表达式,C必须

北京哪间医院治疗白癜风好 https://m.39.net/disease/a_b8vbiu3.html

C++11版本发行已经几年了,许多老项目也切换到C++11版本,而在实际开发中,很多程序员由于不熟悉C++11版本的匿名函数Lambda表达式,也依旧产生着大量冗余,杂乱的代码。

一、旧的表达

在以前,针对排序的比较函数,我们只能写一个cmp函数。

boolcmp(inta,intb){returnab;}voidtest_sort(vectorintvec){sort(vec.begin(),vec.end(),cmp);printf(aftersortcmp:\n);for(inti=0;i10;i++){printf(%d:%d\n,i,vec[i]);}}

然而这个cmp函数只能在这个场景里使用,并且由于旧语法的限制,只能够定义一个全局函数,当需要多个cmp函数时,就显得异常凌乱。

二、新的表达

在C++11版本中,C++引入了匿名函数Lambda表达式。

语法如下:

[capturelist](parameterlist)-returntype{functionbody}

其中第一个方括号代表闭包的特性,用来给匿名函数传递一些外部的变量。

大概分几类:

1、[]不使用任何外部变量

2、[]所有变量都以引用形式使用

3、[=]所有变量都以传值形式使用

4、[x,y]x以传值形式使用,y以引用形式使用。

5、[,x]x以传值形式使用,其他的以引用形式使用。

6、[=,z]z以引用形式使用,其他的以传值形式使用。

7、[=,x,y]可以传入更多的参数

这样,我们就可以愉快的写匿名函数了。

sort(vec.begin(),vec.end(),[](inta,intb)-bool{returnab;})printf(aftersortlambda:\n);for(inti=0;i10;i++){printf(%d:%d\n,i,vec[i]);}

三、实际应用

在现实生产中,我们经常会遇到协程,这里就用协程来举例。

我们知道协程的每个并发都需要按照框架实现一个之类,而且还需要实现一个虚函数,这个虚函数内还可以进行相关的网络操作。这样进行封装后,就可以实现并发的对外请求了。

代码如下:

classRealCoroutine:publicBaseCoroutine{public:intProcess(){returnnetCoroutine();//业务的网络操作在这里进行}}voidtest_task(){vectorBaseCoroutinelist;RealCoroutine*onr=newRealCoroutine();//对one的初始化list.push_back(one);RealCoroutine*two=newRealCoroutine();//对one的初始化list.push_back(two);exe_coroutine_list(list);//处理one的返回结果//处理two的返回结果}

如上所示,由于是并发操作,请求分为两部分来处理,而并发逻辑一多时,整个代码就会非常的凌乱,难以维护。

而此时使用lambda函数封装,则简洁的多。

classLambdaCoroutineList{public:voidoperator+=(constTaskFuncf){//...}intexe(){exe_coroutine_list(list);}private:vectorBaseCoroutinelist;};voidtest_lambda(){LambdaCoroutineListlist;list+=[](){//对one的初始化netCoroutine();//处理one的返回结果};list+=[](){//对two的初始化netCoroutine();//处理two的返回结果}list.exe();}

这时候,只需要在一个匿名函数里面以同步的方式写整个代码逻辑即可。

欢迎


转载请注明:http://www.aierlanlan.com/rzdk/7225.html

  • 上一篇文章:
  •   
  • 下一篇文章: 没有了