最近在几经波折之后,终于对于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中有大量的模板,如果在这种情况下你想要使用虚函数或者继承来写框架的话,会是一件很杯具的事情,在碰了很多次壁之后,我发现其实很多情况下我并不需要纯虚函数,我需要的只是一个函数指针,或者函数对象而已。
分享到:
相关推荐
算是一个消息处理框架吧,用于说函数对象function与bind的基本用法; 比较适合入门boost的function与bind的基本用法
boost stl一些常用函数的使用训练
括号感知的标记化正则表达式 Patrex允许您基于相对...如您所知, boost::bind可以使用成员函数的引用和指针,因此可以将所有此类调用简化为 boost::bind(&Foo::bar, this, ...) 我们不希望盲目搜索和替换boost::ref
你好,世界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
本来想封装线程,想着还要封装类似boost::bind或者signal/solt的,放弃了. 2.该Reactor模型不排除在同一个socket上投递多个eventhandler.一个eventhandler只针对一个socket事件处理(可读,可写.当然事件可以用掩码,本...
Björn Karlsson为中级至高级的C++开发者描述了所有58...可在调用点进行定义的函数对象:Boost.Bind 和 Boost.Lambda 更灵活的回调机制:Boost.Function 可管理的信号和响应动作(又称为Observer模式):Boost.Signals
汉化 boost 文档,致力 boost 推广。 如果你对本项目有兴趣,欢迎加入,相关说明请查阅项目论坛: https://groups.google.com/ 到目前为止,各人贡献的译文如下: 贡献者 贡献的译文 alai04 accumulators, any, ...
于是,动手用c++写了一个小程序(使用了:wxWidgets,boost::bind,upx),功能如下: 1、在存档发生变化时(包括:创建新的存档、修改已有存档),自动将存档拷贝到另一目录。(当然啦,这样备份会越来越多,所以...
于是,动手用c++写了一个小程序(使用了:wxWidgets,boost::bind,upx),功能如下: 1、在存档发生变化时(包括:创建新的存档、修改已有存档),自动将存档拷贝到另一目录。(当然啦,这样备份会越来越多,所以...
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++0x系列的第四篇,主要是内容是C++0x中新增的lambda表达式, function对象和bind机制。之所以把这三块放在一起讲,是因为这三块之间有着非常密切的关系,通过对比学习,加深对这部分内容的理解。在开始之间...
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); 反馈 尽管该库...
由于以上多种原因,决定对boost库进行更高的抽象和封装,对开发者提供一种更为便利的使用接口。 本代码实现了一下主要功能: 1.、为每个TCP客户端建立session,每个session创建事件,向应用开发则投递事件。 事件...
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库基本使用方法,使用cmake2.6构建工程,包含nocopyable\singleton\asio\filesystem\bind\thread\futuer等
看一下 ,看看我们如何向构建中添加js-bind和Boost头文件分发: { "nxxm/js-bind" : { "@" : "v2.0.1" } , "platform" : [ "Boost::+boost" ]}看起来没有构建配方,它将按照惯例构建。 ├── .nxxm│ └── deps...
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 使用 C++11 语言特性(例如类型推断)和头文件(例如和来自<functional> std::bind )。 请注意,虽然我们不针对 GCC v4.4,但迄今为止与它的兼容性很容易保持。 您可以在 Travis 中检查 gcc4.4 构建是否为...
在阅读本书的过程中,读者需要注意本书的排版风格,作者在写作过程中,大量使用了函数名和关键字,例如,“删除”使用了函数名“delete”,“绑定”使用了函数名“bind”,“类型定义”使用了关键字“typedef”等等...
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-...