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);

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

Note Over。

【Boost】boost库中function和bind一起使用的技巧(一)相关推荐

  1. 【Boost】boost库中function和bind一起使用的技巧(二)

    与 Boost.Function 一起使用 Boost.Bind 当我们把 Boost.Function 与某个支持参数绑定的库结合起来使用时,事情变得更为有趣.Boost.Bind 为普通函数.成员 ...

  2. 【Boost】boost库中function的用法

    要开始使用 Boost.Function, 就要包含头文件 "boost/function.hpp", 或者某个带数字的版本,从"boost/function/funct ...

  3. Boost C++ 库

    http://zh.highscore.de/cpp/boost/frontpage.html Boost C++ 库 目录 第 1 章 简介 第 2 章 智能指针 第 3 章 函数对象 第 4 章  ...

  4. 使用 Boost.Lambda 库创建并存储在 Boost.Function 对象中的函子中使用 Boost.Units 的数量、单位和绝对类型

    使用 Boost.Lambda 库创建并存储在 Boost.Function 对象中的函子中使用 Boost.Units 的数量.单位和绝对类型 实现功能 C++实现代码 实现功能 使用 Boost. ...

  5. 【Boost】boost库中thread多线程详解1——thread入门与简介

    1. 概述 线程就是,在同一程序同一时间内允许执行不同函数的离散处理队列. 这使得一个长时间去进行某种特殊运算的函数在执行时不阻碍其他的函数变得十分重要. 线程实际上允许同时执行两种函数,而这两个函数 ...

  6. 【Boost】boost库中timer定时器

    同步Timer asio中提供的timer名为deadline_timer,它提供了超时计时的功能.首先以一个最简单的同步Timer为例来演示如何使用它. #include <iostream& ...

  7. Boost库之function的使用

    http://www.cnblogs.com/hujian/archive/2009/06/04/1495813.html Boost库的function是一组函数对象包装类的模板,实现了一个泛型的回 ...

  8. CLion 使用 clang-cl 工具链时未正确链接 vcpkg 中的 Boost 外部库

    TL;DR: 简单来说是 CLion 的问题; 解决方法就是避免使用 clang-cl 工具链. 2023/02/24 更新: 最新的 CLion EAP 似乎已经修正了这个问题. 昨天比较闲, 就给 ...

  9. boost库中优秀的网络库asio

    文章目录 一.须知 二.ASIO 三.我们将从研究同步操作开始 四.当使用异步操作时,会发生不同的事件序列 五.Proactor模型 六.常用内容 七.C++ 建立本地网络服务器 (Boost.Asi ...

最新文章

  1. 动软代码生成V2.74模版简介
  2. 基于Android SQLite的升级详解
  3. 【机器学习基础】XGBoost、LightGBM与CatBoost算法对比与调参
  4. 前端月趋势榜:7 月最新上榜的、热门的 10 个前端开源项目 - 2107
  5. 【C语言简单说】十:小结
  6. nssl1167-桐人的约会【最短路】
  7. ROC和AUC介绍以及如何计算AUC
  8. STM32F407+CubeMX-使用TIM计算编码器的脉冲总数,并计算脉冲方向
  9. 从阅读空间到QQ阅读,一个web2.0向web1.0的倒退的产品
  10. C#设计模式之二十一访问者模式(Visitor Pattern)【行为型】
  11. 手机计算机快速切换功能,群控系统快速切换多部手机
  12. FlashFXP v3.5.4注册码+FlashFXP v3.6.0注册码+FlashFXP v3.7.2.build.1266...
  13. comtrol 终端服务器,终端服务器:远程控制台管理———终端服务器
  14. spring boot火车票预订系统毕业设计-附源码091029
  15. 基于Docker-compose编排部署sentiment-analyzer情感分析系统(老保姆级讲解-部署)
  16. 微信内转发APP及h5类域名怎么做到防封防拦截,微信域名防红技术原理
  17. SpriteKit从零开始~Physics and Collisions
  18. [GXYCTF2019]Ping Ping Ping 1解题思路
  19. Caffe中BN层与CONV层的融合(merge_bn)
  20. HP电池警告,系统侦测到电池可储存容量过低,为了最佳效能,这颗电池可能需要更换。主电池(601),Enter-继续启动,解决方法

热门文章

  1. SpringBoot异常处理-自定义HandlerExceptionResolver
  2. 多线程——线程的生命周期
  3. 利用 exe4j 将 JAR 包制成免安装 JDK 的 EXE 文件
  4. 210317阶段三opencv
  5. JAVA识别字符串是数字(英文)还是汉字,web页面进行字符截断的帮助类
  6. Notepad++去除代码行号的几种方法
  7. 华为OJ: 公共字符串计算
  8. Android多线程研究(1)——线程基础及源码剖析
  9. CentOS 6.0安装ipvsadm 1.26错误笔录
  10. ConnectivityManager ConnectivityService in Android