boost库 bind/function的使用 [大三四八九月实习]

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

  • 12
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
提供的源码资源涵盖了小程序应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值