boost库 bind/function的使用

来源:互联网 发布:方正字库打包下载 mac 编辑:程序博客网 时间:2024/05/01 22:12

1 bind/function 引

(1)头文件

bind函数#include <boost/bind.hpp>

function使用头文件#include <boost/function.hpp>

如果写程序时出错则在functionbind前面加上限定:"boost::"

 

(2)功能

bind绑定一个函数及其参数.

function是类和模板的组合,它定义的对象可以指向一个函数(包装一个函数 ),类似一个函数指针。既可以直接指向一个函数也可以接收bind的返回值。

 

(3)返回值

bind返回一个函数对象。

function本身是一种类模板,可被看作声明的关键字。

 

2 用法

【bind】

一般用法:bind用于一般普通函数( 以非类、结构的成员函数 )具有多种形式,但用法简单。

用于类、结构的成员函数:bind用于成员函数时必须要在参数列表中指出成员函数在所属的类中的地址,成员函数所属对象,让bind知道此成员函数所属类地址和调用此成员函数的类对象。除了这两点额外的要求后,使用形式跟一般用法一致。

 

【function】

一般用法:function用于一般函数的情况下,只需要按照一般函数的 “返回值”,“参数列表( 参数列表用括号括起来,彼此用逗号隔开 )”来声明对象,然后指向对应的函数地址(函数名)

用于成员函数:单用function来包装类的成员函数,需要按照函数 “返回值”,“类指针类型和参数列表(类指针型别和餐宿列表在括号中,彼此用逗号隔开)”来声明function对象。在调用被包装的函数时,必须要事先定义一个类对象将其地址传入,与声明function对象时的第一个类指针参数相对应。让function对象知道函数的所属地址及具体调用成员函数类对象。

 

【bind & function】

不管是针对一般的函数还是针对类成员函数,都不可以使用占位符来作为bind的参数,因为用function调用包装函数的时候会报参数不对应的错误。另外bind的返回一定要是一个函数地址而不是调用函数的形式。

在针对类成员函数的时候,function对象可以不再有类和对象的地址。因为bind已经将二者包装了。

二者的其它用法跟其单独使用时的规则大同小异。

 

2.1 bind

(1)bind 单用

void print( int i, int j )

{

cout <<i <<"\t" <<j<<"\n";

}

 

[1]全参数绑定

bind(print, 3, 4)();

输出3       4

 

[2]部分参数绑定

bind( print, 3, _1)(4);//使用占位符给调用函数传参占个位置:传入4

输出3       4

 

[3]所有参数都不绑定

bind(print, _1, _2)(3, 4);

输出3       4

 

bind(print, * ,* );*表示参数,返回的是print函数,加在行尾加"()"表示调用print函数。 

 

(2)bind应用于成员函数

bind在用于成员函数时,除了函数地址的重要性之外,还要知道具体是哪一个对象在调用类中的成员函数。如果是在类中的成员函数中调用另外一个成员函数这个对象可以被声明为this。

class Myfun

{

public:

        void print( int i, int j )

        {  

                cout << i<< "\t" << j << "\n";

       }

};

 

Myfun f;

boost::bind(&Myfun::print,f, 3, 4)();

 

要用bind绑定类类中的成员函数时,第一个参数表示成员函数的所在类的地址,第二个参数表示具体调用此成员函数的对象。后面的参数跟bind用于一般函数的用法一致。

 

2.2 function

(1)function应用于一般的函数

针对于一般设计的函数( 非类和结构体中的成员函数 )来说,function指向一个函数的使用形式为:

若函数定义的形式为:type fun_name( type1 i, type2  j){…}

则使用function指向此函数:function<type(type1 i, type2 j)> tf;

tf=fun_name;

调用函数:tf( 1, 2 );

function模板内"<>"所要使用的类型要和函数的一致:type表示所指函数的返回值类型,type1,type2是所指函数参数的类型。

 

void  print( int i, int j )

{

      cout << i << "\t" << j <<"\n";

 }

 

boost::function<void(inti, int j)> tf;

tf =print;

tf(3, 4);

输出3       4

 

(2)function应用于成员函数

要使用function指向一个类的成员函数时,不管是在指向此成员函数还是调用此成员函数都要让function对象知道其地址(声明function对象时就声明了地址部分)。调用成员函数时还只能调用某一个对象的成员函数。

class Myfun

{

public:

        void print( int i, int j )

       {

                cout << i<< "\t" << j << "\n";

       }

};

 

boost::function<void(Myfun*,int i, int j)> tf;

tf =&Myfun::print;

Myfun f;

tf(&f::print,3, 4);

输出3       4

function应用直接应用于类的成员函数时,声明时要声明对应成员函数类的指针对象,在调用时再将定义的类对象的地址传入

 

2.3bind & function联用

(1)普通函数(非成员函数)

对于普通函数,bind绑定函数全部参数或者全部参数缺省用占位符代替的情况都可以和function连用。不能在bind绑定函数时使用占位符来缺省部分参数,然后再和function连用,在bind内使用占位符时,如果在bind绑定函数后面补齐参数则与function对象的类型不匹配,如果在使用function对象时补齐参数,则编译器会报函数参数不一致的错误。

 

(2)用于成员函数

class Myfun

{

public:

        void print( int i, int j )

        {

                cout << i<< "\t" << j << "\n";

        }

};

……...

 boost::function<void(int i, int j)> tf;

 Myfun f;

 tf = boost::bind(&Myfun::print, f, 3, 4);

tf(3, 4);

 

可编写程序验证二者联用需要遵循的规则。就前面笔记。

 

 Note Over

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 吃了米粉不拉屎怎么办 奇异果奶昔苦了怎么办 8个月宝宝偏瘦怎么办 一岁宝宝螺旋腿怎么办 七个月宝宝晚上咳嗽厉害怎么办 孕7个月感冒咳嗽怎么办 4个月婴儿肺炎怎么办 宝宝吃胡萝卜泥拉肚子怎么办 宝宝吃土豆泥不消化怎么办 五个月宝宝奶睡怎么办 橘子和牛奶一起吃了怎么办 半岁宝宝不喝水怎么办 一岁宝宝总是便秘怎么办 1岁的宝宝不喝水怎么办 两月宝宝不喝水怎么办 破壁机打出的果汁很浓稠怎么办 榨的果汁不甜怎么办 11个月宝宝吃盐怎么办 1岁半宝宝长牙慢怎么办 小孩里面的牙黑怎么办 7个半月宝宝便秘怎么办 2个月婴幼儿便秘怎么办 3个月宝宝不消化怎么办 一天大便二三次不消化怎么办 不消化没胃口几天不大便怎么办? 两个月的宝宝拉绿屎怎么办 肠胃不好消化功能差怎么办 2岁宝宝消化不好怎么办 5天新生儿不拉大便怎么办 七个月宝宝一周不拉屎怎么办 七个月的宝宝消化不良怎么办 七个月宝宝消化不良拉肚子怎么办 宝宝六个月了便秘怎么办 宝宝拉水酸臭味怎么办 50天婴儿不拉屎怎么办 六个月宝宝吃米粉便秘怎么办 纯母乳喂养的宝宝便秘了怎么办 换奶粉拉绿色是怎么办 2个月宝宝发烧怎么办 小宝绿色稀大便怎么办 新生儿吃奶粉大便干燥怎么办