函数对象点滴

有时候我们想要回调的函数或函数对象不满足该回调所期望的型别,仅仅是因为多了几个事先可以确定的参数,这时用boost.bind就很方便,它是std::bind1st和std::bind2nd的一般化,它能绑定任意参数到一个特定的值,或者把输入参数传递到任意位置。绑定方式也很灵活,而且支持函数对象和成员函数的绑定。比如想使用 boost::thread 创建一个线程来执行函数:void f(int i),如果写成boost::thread thrd(f)是不对的,因为thread构造函数声明接受的是一个没有参数且返回类型为void的型别,而且不提供参数i的值的f也不可能运行。这时就可以写:

boost::thread thrd(bind(f, 1))//假设以1为实参运行f                

再如:想对vector<int> v 中的每个元素做个处理,而负责处理的函数是类 A 成员函数 void A::f(int i) ,这时就可写:

A a;
for_each(v.begin(), v.end(), bind(&A::f, &a, _1));

写法看起来有点奇怪,但是只要我们清楚:bind生成的是一个函数对象,其写法一定表达的是该函数对象的逻辑,该逻辑对bind来讲,就是写出调用被绑定函数的表达式,该表达式通常是要用该函数对象的参数的,于是用 _1 来代表第一个形参, _2 来代表第二个形参,。。。,对于成员函数,可以认为它的第一个参数是个 this 指针。 再举几个例子,假设有函数void f(int i, int j, int m)

         bind(f, _1, _1);//生成带一个参数的函数对象,以这个参数作为f的第一和第二个实参来调用f
bind(f, _1, _1+1, _2);//生成带两个参数的函数对象,以第一个参数作为f的第一个实参,第一个参数加1作为f的第二个实参,第二个参数作为f的第三个实参来调用f

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值