2019独角兽企业重金招聘Python工程师标准>>>

先了解一下:函数对象

重载函数调用操作符的类,其对象常称为函数对象(function object),即它们是行为类似函数的对象。[1]

一个类对象,表现出一个函数的特征,就是通过“对象名+(参数列表)”的方式使用一个

类对象,如果没有上下文,完全可以把它看作一个函数对待。这是通过重载类的

operator()来实现的。比如,对于调用

int s = sum(1, 1);

你可能把它看作一个函数调用:

int sum(int i, int j) { return i+j; }

但很可能它是一个函数对象:

class Sum {

public:

int operator()(int i, int j) { return i+j; }

};

Sum sum;

而大多数情况是

template <class T>

class Sum {

public:

T operator()(T i, T j) { return i+j; }

};

Sum <int> sum;

“在标准库中,函数对象被广泛地使用以获得弹性”,标准库中的很多算法都可以

使用函数对象或者函数来作为自定的回调行为;

当我们使用函数时习惯于C函数的格式,即如下形式

resulttype funname( arglist );

返回值类型 函数名( 参数列表 );

在Boost.Function中,我们可以方便的定义定义函数对象。不过在定义用来表示类成员函数的函数对象时

第一个参数是类指针。而且在调用时,要传入一个类实例的指针。这样用起来并不是很方便,因为调用者

要知道类实例。这实际上没有实现解耦。而解耦是我们使用回调或委托设计的一个目标。

为了解决这个问题,我们要使用Boost.Bind库

Boost.Bind是一个函数对象工厂。他用来产生我们需要的函数对象。好了,有了它,你可以在你设计中大

量使用Boost.Function。不用再去定义类成员函数形式的函数对象啦,只用定义普通函数对象。

一个简单的例子

class CExample

{

public:

bool printstr( const std::string &str )

{

std::cout << "CExample::printstr" << str << std::endl;

return true;

}

};

//定义一个函数对象

boost::function< bool ( const std::string& ) > printstr;

//用Boost.Bind创建一个函数对象,赋给printstr

CExample example;

printstr = boost::bind( &CExample::printstr, &example, _1 );

好了,我们创建了一个函数对象,而且调用时不再需要类实例拉。用Boost.Function和Boost.Bind大大

的简化了Command模式的实现。

在上面的例子中要个古怪的对象"_1"。这个叫做站位符,他代表这个位置有个参数,但现在还不知道参

数是什么。_1代表参数列表中的第一个位置上的参数。Boost.Bind一共定义了9个站位符对象。如下

_1,_2,_3,_4,_5,_6,_7,_8,_9。分别代表参数列表中位子。

Boost.Bind产生的函数对象可以直接使用,利用上面的例子。

bool b = boost::bind( &CExample::printstr, &example, _1 )( "Hello World" );

转载于:https://my.oschina.net/lcxidian/blog/381658

Boost::Bind 基础相关推荐

  1. Boost.Bind的基础使用

    当我们使用函数时习惯于C函数的格式,即如下形式 resulttype funname( arglist ); 返回值类型 函数名( 参数列表 ); 在Boost.Function中,我们可以方便的定义 ...

  2. boost.asio基础篇 小白入门注解

    参考资料:https://blog.csdn.net/caoshangpa/article/details/79231740 一个基础的同步客户端 //使用asio的所有程序都需要至少有一个io_co ...

  3. c++ Boost库之boost::bind学习

    刚开始学c++,就看boost库其实有点小小的不情愿. 团队要求必掌握的Boost库: boost::bind boost::function boost::Signals2 学习前奏:在写关于coc ...

  4. boost::bind 介绍

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

  5. boost bind使用指南

    bind - boost 头文件: boost/bind.hpp bind 是一组重载的函数模板. 用来向一个函数(或函数对象)绑定某些参数. bind的返回值是一个函数对象. 它的源文件太长了. 看 ...

  6. 展示使用 boost bind 和 phoenix 处理删除的不同方法的测试程序

    展示使用 boost bind 和 phoenix 处理删除的不同方法的测试程序 实现功能 C++实现代码 实现功能 展示使用 boost bind 和 phoenix 处理删除的不同方法的测试程序 ...

  7. Boost:boost :: bind相等运算符的测试程序

    Boost:boost :: bind相等运算符的测试程序 实现功能 C++实现代码 实现功能 boost :: bind相等运算符的测试程序 C++实现代码 #include <boost/c ...

  8. boost::bind时候注意性能问题

    原文地址:http://hi.baidu.com/hpagent/blog/item/471b7d92dc8ac39ca977a4dc.html 测试一下,看看例子 #include <iost ...

  9. 【Boost】以boost::function和boost:bind取代虚函数

    这是一篇比较情绪化的blog,中心思想是"继承就像一条贼船,上去就下不来了",而借助boost::function和boost::bind,大多数情况下,你都不用上贼船. boos ...

最新文章

  1. 物联网推动时代进步 中小玩家如何傍上运营商这棵大树
  2. Delphi中高级DLL的编写和调用
  3. spring 框架-java配置163邮件服务器,发送邮件
  4. crontab 提示 command not found 解决方案
  5. 【系统架构设计师】软考高级职称,一次通过,2017年下半年系统架构设计师考试论文真题(论软件架构风格)
  6. Qt 小技术总结-持续更新
  7. apache tomcat linux 配置,linux下apache+tomcat配置
  8. 大数据算法_大数据算法下的我们,犹如“皇帝的新衣”
  9. win10字体安装_Win10操作系统下字体的安装教程(非常详细,适合新手DIY)
  10. 基于STM32的超声波HC-SR04和红外测距模块测量距离的实验对比(HAL库)
  11. 泰迪杯数据挖掘挑战赛—数据预处理(二)
  12. android是什么意思
  13. Win32 API 列表5 (格式有点乱)
  14. office安装双击setup后点击‘立即安装’无反应(闪退)
  15. 字节跳动技术面都过了,结果还是被刷了,问HR原因竟是。。。
  16. 模仿猫眼电影App一个动画效果
  17. 交换机和路由器技术-13-三层交换
  18. 土壤水分传感器的工作原理和应用环境
  19. 分布式事务系列02--分布式事务定义,理论基础--CAP,BASE,酸碱平衡
  20. 数码相框方案_索尼NEX5评测:具有视频功能的数码单反相机

热门文章

  1. 如何linux网页修改回80端口,linux下如何修改iptables开启80端口
  2. 【转载】美国煤层气发展史
  3. vbScript中WScript.Shell对象的 run 和 exec
  4. Windows网络命令行程序
  5. 考研(一):一段不错的经历之考研总结
  6. 用英伟达Jetson Nano运行PyTorch Fast.ai丨手把手教程+第三方工具
  7. 全球高校CS实力最新排行:清华AI界第二,中科院视觉领域最强
  8. 扎克伯格5小时听证鏖战:五大焦点,四处尴尬,一次耿直CEO笑翻全场
  9. Arm推出全新Mali多媒体套件,想让机器学习进入中低端智能手机
  10. AlphaZero完胜三大世界冠军棋类程序:5000个TPU、自学一天