`
javatgo
  • 浏览: 1125172 次
  • 性别: Icon_minigender_2
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

boost::bind的使用

 
阅读更多

最近在几经波折之后,终于对于boost::bind有点理解了。对于习惯了其他语言的人来说,boost::bind是个挺神奇的东西,它可以将你的方法适配成任何其他的方法。其实这得益于c++的模板以及操作符重载,去看boost::bind的实现就会发现它是一个有n多重载的函数,这些重载主要是为了适应函数的参数个数。

其实boost::bind的原理是函数对象,而函数对象就是一个重载了()操作符的对象,这样我们就可以像调用一个方法一样来调用一个类上的这个操作符,比如a(),其实你是在调用a这个对象的()方法,而不是调用一个叫a的方法。

一般来说boost::bind有两种方式的调用,一种是对自由方法,也取非类方法, 一种是对类方法。

对自由方法来说,直接boost::bind(函数名, 参数1,参数2,...)

对类方法来说,直接boost::bind(&类名::方法名,类实例指针,参数1,参数2)

这里需要额外注意的问题是,函数对象也可以像自由方法一样被bind,而boost::function也是一种函数对象。

接下来我们需要注意什么情况下需要用_1, _2这样的参数。

举个例子

void test(int a, int b, int c)

boost::bind(test, 1, _1, _2)得到一个函数对象b,当我们调用b(3,4)时,相当于调用test(1,3,4)

boost::bind(test, _2, 3, _1)得到一个函数对象b,当我们调用b(3,4)时,相当于调用test(4,3,3)

看明白了没有?你实际上可以指定一些常量和一些占位符进去,_x这样的就是占位符,_1表示实际调用时的参数位置,也即b(3,4)时_1代表3,_2代表4

当然你也可以将所有的参数都指定

比如boost::bind(test,1,2,3),那么在调用b()时就相当于调用test(1,2,3)

需要注意的一点是,boost::bind里的参数个数一定要与被bind的函数相同,否则这个函数对象就无法生成了,编译器会抱怨一堆信息,如果你仔细看的话,它是在告诉你,没有这样的函数,你实际的函数是....,这是使用c++很杯具的一点,当遇到模板时,一旦报错,那些信息直接可以令人崩溃。

在asio中,boost::bind被大量使用,原因是异步的情况下,每个函数的调用是独立的,它的所有信息应该包含在它的调用,也即函数对象中。因此asio中有大量的模板,如果在这种情况下你想要使用虚函数或者继承来写框架的话,会是一件很杯具的事情,在碰了很多次壁之后,我发现其实很多情况下我并不需要纯虚函数,我需要的只是一个函数指针,或者函数对象而已。

分享到:
评论

相关推荐

    基于boost的bind与function的消息处理框架

    算是一个消息处理框架吧,用于说函数对象function与bind的基本用法; 比较适合入门boost的function与bind的基本用法

    c++ boost bind

    boost stl一些常用函数的使用训练

    patrex:括号感知的标记化正则表达式

    括号感知的标记化正则表达式 Patrex允许您基于相对...如您所知, boost::bind可以使用成员函数的引用和指针,因此可以将所有此类调用简化为 boost::bind(&Foo::bar, this, ...) 我们不希望盲目搜索和替换boost::ref

    HelloWorld:Hello World 演示测试项目

    你好,世界Hello World 演示测试项目结构体 CB { typedef boost::variant< boost> , boost::function<void> > ...< str> f( boost::bind( &CB::fun2, this, _1 ) );callback_["A"] = f ; boost::get< boost> >(callbac

    一个windows下基于select多路分离器的Reactor模型

    本来想封装线程,想着还要封装类似boost::bind或者signal/solt的,放弃了. 2.该Reactor模型不排除在同一个socket上投递多个eventhandler.一个eventhandler只针对一个socket事件处理(可读,可写.当然事件可以用掩码,本...

    Boost带领你远远地超越了C++标准库,它使得C++编程更优雅、更有活力、更高产。首先,我们系统地介绍一下Boost库的主要组成和它们的主要用法

    Björn Karlsson为中级至高级的C++开发者描述了所有58...可在调用点进行定义的函数对象:Boost.Bind 和 Boost.Lambda 更灵活的回调机制:Boost.Function 可管理的信号和响应动作(又称为Observer模式):Boost.Signals

    boost 1.41 中文文档,使用帮助,教程手册

    汉化 boost 文档,致力 boost 推广。 如果你对本项目有兴趣,欢迎加入,相关说明请查阅项目论坛: https://groups.google.com/ 到目前为止,各人贡献的译文如下: 贡献者 贡献的译文 alai04 accumulators, any, ...

    饥荒存档自动备份及恢复工具

    于是,动手用c++写了一个小程序(使用了:wxWidgets,boost::bind,upx),功能如下: 1、在存档发生变化时(包括:创建新的存档、修改已有存档),自动将存档拷贝到另一目录。(当然啦,这样备份会越来越多,所以...

    饥荒存档自动备份及恢复工具【2014/01/03更新版】

    于是,动手用c++写了一个小程序(使用了:wxWidgets,boost::bind,upx),功能如下: 1、在存档发生变化时(包括:创建新的存档、修改已有存档),自动将存档拷贝到另一目录。(当然啦,这样备份会越来越多,所以...

    THE BOOST C++ LIBRARIES

    THE BOOST C++ LIBRARIES是一份自己编译的chm格式文档,描述了如何使用boost类库,目录如下: Front page Chapter 1: Introduction 1.1 C++ and Boost 1.2 Development Process 1.3 Installation 1.4 Overview ...

    C++ function、bind以及lamda表达式

    本文是C++0x系列的第四篇,主要是内容是C++0x中新增的lambda表达式, function对象和bind机制。之所以把这三块放在一起讲,是因为这三块之间有着非常密切的关系,通过对比学习,加深对这部分内容的理解。在开始之间...

    pipeline:基于n3534的流水线实现

    auto grep_error = std::bind(grep, "Error.*", _1, _2); (boost::pipeline::from(input) | trim | grep_error | [] (const std::string& item) { return "-> " + item; } | output ).run(pool); 反馈 尽管该库...

    tcp server boost asio

    由于以上多种原因,决定对boost库进行更高的抽象和封装,对开发者提供一种更为便利的使用接口。 本代码实现了一下主要功能: 1.、为每个TCP客户端建立session,每个session创建事件,向应用开发则投递事件。 事件...

    Beyond the C++ Standard Library An Introduction to Boost

    practice solutions for performing type conversions and lexical conversions <br...Boost.Bind and Boost.Lambda <br>More flexible callbacks with Boost.Function <br>Managed signals and slots (a.k.a....

    BOOST入门笔记

    boost库基本使用方法,使用cmake2.6构建工程,包含nocopyable\singleton\asio\filesystem\bind\thread\futuer等

    get-started:本教程示例项目可轻松开始使用nxxm

    看一下 ,看看我们如何向构建中添加js-bind和Boost头文件分发: { "nxxm/js-bind" : { "@" : "v2.0.1" } , "platform" : [ "Boost::+boost" ]}看起来没有构建配方,它将按照惯例构建。 ├── .nxxm│ └── deps...

    Beyond.the.C++ - Standard.Library.An.Introduction.to.Boost

    practice solutions for performing type conversions and lexical conversions <br...Boost.Bind and Boost.Lambda <br>More flexible callbacks with Boost.Function <br>Managed signals and slots (a.k.a....

    riak-cpp:用于 C++11 编译器的 Riak 客户端库

    Riak 使用 C++11 语言特性(例如类型推断)和头文件(例如和来自<functional> std::bind )。 请注意,虽然我们不针对 GCC v4.4,但迄今为止与它的兼容性很容易保持。 您可以在 Travis 中检查 gcc4.4 构建是否为...

    Beyond.the.C.plus.plus.Standard.Library.An.Introduction.to.Boost

    在阅读本书的过程中,读者需要注意本书的排版风格,作者在写作过程中,大量使用了函数名和关键字,例如,“删除”使用了函数名“delete”,“绑定”使用了函数名“bind”,“类型定义”使用了关键字“typedef”等等...

    downloads.part1.rar

    atomic-boost-1.70.0.tar.gz boostorg-beast-boost-1.70.0.tar.gz boostorg-bimap-boost-1.70.0.tar.gz boostorg-bind-boost-1.70.0.tar.gz boostorg-build-boost-1.70.0.tar.gz boostorg-callable_traits-boost-...

Global site tag (gtag.js) - Google Analytics