Chinaunix首页 | 论坛 | 博客
  • 博客访问: 300010
  • 博文数量: 63
  • 博客积分: 814
  • 博客等级: 军士长
  • 技术积分: 700
  • 用 户 组: 普通用户
  • 注册时间: 2010-05-09 15:46
文章分类

全部博文(63)

文章存档

2017年(1)

2016年(4)

2015年(13)

2014年(9)

2012年(3)

2011年(33)

分类: C/C++

2015-01-20 21:41:21


http://blog.chinaunix.net/uid-20726254-id-3483489.html

虽然也在泛型那一章,但这个挺好玩的,单拿出来总结下,越来越有python的感觉.

std::bind通俗说就是一个 callabe adapter,因为有些场合需要的callable的参数个数不一样,可能实现差不多,完全重写又价值不大,以前的版本有bind1st和bind2nd,在c++11中这哥俩已经deprecated了,没准哪天就彻底game over了。

bind的语法格式:auto newCallable = bind(callable, arg_list); 看个简单例子

点击(此处)折叠或打开

  1. #include<functional>

  2. using namespace std::placeholders;
  3.   void f5(int i,int j)
  4.   {
  5.       if(i<j> cout<<i<<endl;
  6.       else cout<<j<<endl;
  7.   }
  8. auto f_bind=bind(f5,_1,10);
  9.  
  10.   int main(){
  11.   f_bind(6);
  12.   f_bind(10);
  13.   cout<<"end in main \n"<<endl;
  14.   return 0
  15.   }


首先bind在functional头文件中,记得引入。f5函数比较2个参数大小,输出小的。可是某些场景下,我们想要带一个参数的比较函数,内部直接和10进行比较,这时就可以把f5用bind包裹一下。



新函数是f_bind,右侧bind的参数里带下划线的数字称为placeholder,表示新函数的第几个参数,当然最大的数值就是f_bind的参数个数。词条语句的意思是新函数f_bind包裹了f5,其第一个也是唯一的参数作为f5的第一个参数,同时将整数10作为f5的第二个参数传入。

placeholder在std内部定义的placeholders空间内,如果不用using声明下就要使用全称。其数值的编号要按顺序,但在bind参数列表可以不按书序出现:


点击(此处)折叠或打开

  1. auto g = bind(f, a, b, _2, c, _1);
  2. g(X, Y) ;
  3. f(a, b, Y, c, X);



书中这个例子对照一看就应该明白了。g(X,Y)等于调用了f(a,b,Y,c,X);


bind和lambda表达式一样,默认都是传值的,如果想要用引用,需要ref或cref函数,后者是常引用,也都位于functional头文件。

auto g = bind(f, ref(a), cref(b).....)



std::function  std::bind 区别
http://blog.csdn.net/qq575787460/article/details/8531397

此篇解释的非常好
http://www.cnblogs.com/slysky/p/3822640.html


阅读(5661) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~