文档章节

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

尘中远
 尘中远
发布于 2016/05/12 23:52
字数 465
阅读 127
收藏 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编辑器而已

© 著作权归作者所有

共有 人打赏支持
尘中远
粉丝 1
博文 26
码字总数 47436
作品 0
朝阳
程序员
[转]想看懂WebRtc,你须知道的C++11新特性「lambda,std::function以及std:bind」

转自:只为那传说中美丽的草原 C++11 中增加了许多的新特性。 在本文中,我们来聊一下lambda表达式,闭包,std::function以及std::bind。 lambda 表达式 C++11中新增了lambda 表达式这一语言...

音视频直播技术专家
2017/11/09
0
0
C++ std::function 和 std::bind

C++11提供了std::function和std::bind两个工具,用于引用可调用对象。这些可调用对象包括 普通函数,Lambda表达式,类的静态成员函数,非静态成员函数以及仿函数等。引用可调用对象,可以用于...

yepanl
09/23
0
0
c++ 11 新特性

new (std::nothrow)A()当内存不足时,返回null std::function<A(int)>代表一个可调用对象,接受1个int的参数,返回值是A 对于c++ 对象的方法,可以通过std::bind 转换为可调用对象 A a ...

yizhangxyz
2016/04/28
12
0
CC_CALLBACK原理及应用

c++ 11 基础 : std::function 类模版 std::function是一种通用、多态的函数封装。std::function的实例可以对任何可以调用的目标进行存储、复制、和调用操作,这些目标包括函数、lambda表达式...

霄霄月月
2014/04/07
0
1
函数对象的四种写法,哪种更适合你?

摘要:作为函数式编程的核心,函数对象的创建和传递都有不同的实现方法。本文将带领你一同了解四种函数对象创建方法和两种函数对象传递方法,并剖析其各自的优劣之处。 数十款阿里云产品限时...

汪星人1997
04/24
0
0

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周六乱弹 —— 到底谁是小公猫……

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @莱布妮子:分享Trivium的单曲《Throes Of Perdition》 《Throes Of Perdition》- Trivium 手机党少年们想听歌,请使劲儿戳(这里) @小鱼丁:...

小小编辑
35分钟前
36
1
基础选择器

注意:本教程参考自网上流传的李兴华老师的jquery开发框架视频,但是苦于没有相应的配套笔记,由我本人做了相应的整理. 本次学习的内容 学习jquery提供的各种选择器的使用,掌握了jquery选择...

江戸川
41分钟前
1
0
Spring中static变量不能@value注入的原因

今天本想使用@Value的方式使类中的变量获得yml文件中的配置值,然而一直失败,获得的一直为null。 类似于这样写的。 public class RedisShardedPool { private static ShardedJedisPool pool...

钟然千落
今天
2
0
CentOS7防火墙firewalld操作

firewalld Linux上新用的防火墙软件,跟iptables差不多的工具。 firewall-cmd 是 firewalld 的字符界面管理工具,firewalld是CentOS7的一大特性,最大的好处有两个:支持动态更新,不用重启服...

dingdayu
今天
1
0
关于组件化的最初步

一个工程可能会有多个版本,有国际版、国内版、还有针对各种不同的渠道化的打包版本、这个属于我们日常经常见到的打包差异化版本需求。 而对于工程的开发,比如以前的公司,分成了有三大块业...

DannyCoder
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部