文档章节

Lambda表达式:代替std::bind的绝佳方法

尘中远
 尘中远
发布于 2016/05/12 23:52
字数 465
阅读 183
收藏 0

「深度学习福利」大神带你进阶工程师,立即查看>>>

Lambda表达式:代替std::bind的绝佳方法

lambda表达式使得函数指针有了更灵活的使用方法,但是有些时候,对于大型的函数,还是不建议用lambda表达式,谁也不想在函数里又看到一段长长的函数。

Lambda表达式的用法在:C++11 lambda表达式在for_each和transform算法下的使用已经进行了介绍。另外我在另一篇文章利用C++11的function和bind功能,实现QStandardItemModel的通用遍历函数里使用了std::bind功能,这个函数是为了把一个多变量的函数指针转变为一个指定变量的函数指针
例如有个函数如:

void fun1(int a)

但实际上你可能想要传入的函数是这样写的:

void funMy(int a,double* b,float other)

这时,可以通过std::bind来实现函数的绑定。std::placeholders::_1这种占位符就是用在变量绑定的,但是横看竖看都觉得别扭
上面的例子得这样写

double  b = 1.0;
float other = 2.0;
std::bind(funMy,std::placeholders::_1,&b,other));

当然,如果你不知道还有·std::bind·这样的函数,你可能会这样写:

void funMy_2(int a)
{
    double  b = 1.0;
    float other = 2.0;
    funMy(a,&b,other );
}

这样就把那个三参数的funMy(int a,double* b,float other)转换为单参数的fun1(int a),使得函数指针的参数一致,但是得再写一个函数好麻烦的……
但是有了Lambda表达式后,第二种之前比较不好的方式反而变得更好
因为funMy_2可以这样代替:

double  b = 1.0;
float other = 2.0;
[&](int a){funMy(a,&b,other );}

直接就产生一个匿名的void(*(int))函数指针!

PS:
写这个只是手痒试试CSDN的markDown编辑器而已

尘中远
粉丝 2
博文 26
码字总数 47436
作品 0
朝阳
程序员
私信 提问
加载中
请先登录后再评论。
DNS 管理系统--NamedManager

NamedManager 是一个基于 Web 的 DNS 管理系统,可用来添加、调整和删除 DNS 的 zones/records 数据,支持 Bind 作为后端的 DNS 服务,支持 IPv4 和 IPv6。...

匿名
2013/01/23
8.8K
0
DNS服务器软件--BIND 10

BIND 10 是下一代的 Bind 。 Bind是一款开放源码的DNS服务器软件,Bind由美国加州大学Berkeley分校开发和维护的,全名为Berkeley Internet Name Domain它是目前世界上使用最为广泛的DNS服务器...

匿名
2013/02/22
3.7K
1
Swing界面分析和调试工具--Swing Inspector

Swing Inspector是一个Java Swing/AWT用户界面分析和调试工具,功能与firebug类似,具有强大的Swing/AWT用户界面分析和调试相关功能。 适用于从java swing初级到高级的所有开发人员,能够快速...

匿名
2013/03/06
3.4K
0
开源数据访问组件--Smark.Data

Smark.Data是基于Ado.net实现的数据访问组件,提供基于强类型的查询表达式进行灵活的数据查询,统计,修改和删除等操作;采用基于条件驱动的操作模式,使数据操作更简单轻松;内部通过标准SQL...

泥水佬
2013/03/12
2.6K
0
Java™ 编译器--Janino

Janino是一个超级小但又超级快的Java™ 编译器. 它不仅能像javac工具那样讲一组源文件编译成字节码文件,还可以对一些Java表达式,代码块,类中的文本(class body)或者内存中源文件进行编译,...

匿名
2013/04/02
4.1K
0

没有更多内容

加载失败,请刷新页面

加载更多

没有指定分支的“git push”的默认行为 - Default behavior of “git push” without a branch specified

问题: I use the following command to push to my remote branch: 我使用以下命令推送到我的远程分支: git push origin sandbox If I say 如果我说 git push origin does that push ch......

技术盛宴
今天
21
0
为什么在允许某些Unicode字符的注释中执行Java代码?

问题: The following code produces the output "Hello World!" 以下代码生成输出“Hello World!” (no really, try it). (不,真的,试试吧)。 public static void main(String... args......

富含淀粉
今天
18
0
字符串格式:%与.format - String formatting: % vs. .format

问题: Python 2.6 introduced the str.format() method with a slightly different syntax from the existing % operator. Python 2.6引入了str.format()方法,其语法与现有的%运算符略有不......

javail
今天
22
0
什么是按位移位(位移)运算符以及它们如何工作? - What are bitwise shift (bit-shift) operators and how do they work?

问题: I've been attempting to learn C in my spare time, and other languages (C#, Java, etc.) have the same concept (and often the same operators) ... 我一直在尝试在业余时间学习......

法国红酒甜
今天
32
0
OSChina 周二乱弹 —— 卧槽 李荣浩的契约兽啊

Osc乱弹歌单(2020)请戳(这里) 【今日歌曲】 @薛定谔的兄弟 :分享洛神有语创建的歌单「我喜欢的音乐」: 《红色的回忆》- 痛仰乐队 手机党少年们想听歌,请使劲儿戳(这里) 动弹, 又好多...

小小编辑
今天
81
1

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部