目录(?)[+]

1 bind/function 引

(1)头文件

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

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

如果写程序时出错则在function及bind前面加上限定:"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);

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

boost bind function用法说明的更多相关文章

  1. 借助boost bind/function来实现基于对象编程。

    boost bind/function库的使用: 替换了stl中mem_fun,bind1st,bin2nd等函数.用户注册回调函数需要利用boost/bind转化成库中boost/function格 ...

  2. (转)boost::bind介绍

    转自:http://www.cnblogs.com/sld666666/archive/2010/12/14/1905980.html 这篇文章介绍boost::bind()的用法, 文章的主要内容是 ...

  3. boost::bind 介绍

    boost::bind 介绍   这篇文章介绍boost::bind()的用法, 文章的主要内容是参考boost的文档. 1. 目的 boost::bind 是std::bindlist 和 std: ...

  4. boost::bind 和 boost::function 基本用法

    这是一篇介绍bind和function用法的文章,起因是近来读陈硕的文章,提到用bind和function替代继承,于是就熟悉了下bind和function的用法,都是一些网上都有的知识,记录一下,期 ...

  5. 以boost::function和boost:bind取代虚函数

    转自:http://blog.csdn.net/Solstice/archive/2008/10/13/3066268.aspx 这是一篇比较情绪化的blog,中心思想是“继承就像一条贼船,上去就下不 ...

  6. boost::function和boost:bind取代虚函数

    以boost::function和boost:bind取代虚函数 这是一篇比较情绪化的blog,中心思想是"继承就像一条贼船,上去就下不来了",而借助boost::function ...

  7. boost::function和boost::bind 介绍

    一. boost::function介绍 原文:http://www.cnblogs.com/sld666666/archive/2010/12/16/1907591.html 本片文章主要介绍boo ...

  8. boost之bind,function,signal总结

    boost里的bind,function,signal三个组件都是对用函数做参数(其他算法也用函数做参数),对函数的某一项进行操作. bind主要是对函数参数的作用. function主要是对函数地址 ...

  9. 关于boost::function与boost::bind函数的使用心得

    最近开始写一个线程池,期间想用一个通用的函数模板来使得各个线程执行不同的任务,找到了Boost库中的function函数. Boost::function是一个函数包装器,也即一个函数模板,可以用来代 ...

随机推荐

  1. iOS Application Project与OS X Application Project对于plist使用的区别

    前几天因为在开源中国看到一个求源代码的问题: 模拟一个动物园系统MyZoo 1.动物园里面有三种动物:Panda,Elephant,Kangaroo 2.三种动物都有一定的数量(不止一只) 3.动物有 ...

  2. CuteEditor.Editor+a+a+c+a+a.a() System.RuntimeType.get_Assembly() 问题解决方法

    问题: Server Error in '/' Application. Attempt by method 'CuteEditor.Editor+a+a+c+a+a.a()' to access m ...

  3. Java中ArrayList和LinkedList区别、ArrayList和Vector的区别

    一般大家都知道ArrayList和LinkedList的大致区别: 1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构. 2.对于随机访问get和set,Ar ...

  4. 用nodejs实现读取文件操作

    //如果不是全局就得引入fs成员 const fs = require("fs"); //fs 核心模块中提供了一个 fs.readFile方法,来读取指定目录下的文件 //fs. ...

  5. SQL Server 利用WITH AS递归获取层级关系数据

    WITH AS短语,也叫做子查询部分(subquery factoring),在SQL Server 2005中提供了一种解决方案,这就是公用表表达式(CTE),使用CTE,可以使SQL语句的可维护性 ...

  6. 吴恩达深度学习笔记(十一)—— dropout正则化

    主要内容: 一.dropout正则化的思想 二.dropout算法流程 三.dropout的优缺点 一.dropout正则化的思想 在神经网络中,dropout是一种“玄学”的正则化方法,以减少过拟合 ...

  7. 提高MySQL效率与性能的技巧

    为查询缓存优化你的查询 大多数的MySQL服务器都开启了查询缓存.这是提高性最有效的方法之一,而且这是被MySQL的数据库引擎处理的.当有很多相同的查询被执行了多次的时候,这些查询结果会被放到一个缓存 ...

  8. 【算法】fhqtreap初探

    NOIP回来就一直想着学平衡树...平衡树写久了调不出来真的会头脑发热.jpg 大概只写了几道题... fhqtreap是不需要旋转的平衡树,仅使用分裂合并,一样可以保持平衡树的性质,并且可以非常简单 ...

  9. 织梦dedecms 自带采集的缩略图地址后面有“/”斜杠的解决方法

    本来想偷懒在网上找一些文档去解决织梦采集缩略图地址带“/”的问题的,可是找了找发现没有人写出解决方法,只好自己动手了. 过程很复杂,找了问题的原因也是找了半天,自己一点一点的测试.最后找到了问题所在. ...

  10. C语言下文件目录查看

    C语言下文件目录遍历通常会用到下面这些函数 _access()        /* 判断文件或文件夹路径是否合法 */ _chdir() /* 切换当前工作目录 */ _findfirst()   / ...