文档章节

boost::bind

invictus_lee
 invictus_lee
发布于 2014/06/03 11:07
字数 1023
阅读 62
收藏 1

其实这是很久之前留的一个坑了,一直没有填。。

记得在刚开始看到 boost::bind 的使用的时候,我整个人都惊呆了:天哪,C++还能这样!!

于是去google搜索其原理,然后看到一篇 好文 ,这篇博客的作者也是 Boost.Asio 的作者。博客中的几张图非常到位,于是就想将其翻译成中文(其实是用于在将来自己忘记了的时候方便再看:-p),结果这个坑一直没有填,今天终于把填上了。

下面是翻译,未完全遵守原文一字一句翻译(其实不仅是不遵守,某些地方我完全按自己的想法来了:-D):


在Asio中,所有的异步操作都需要一个函数对象参数,亦称为completion handler,用于在异步操作完成时调用。这个handler的签名取决于异步操作的类型。例如:一个用于io_service::post() 的handler必须拥有下面的签名:

void handler();

但异步等待操作的handler的签名则如下:

void handler(error_code ec);

而异步读/写操作则需要如下签名的函数:

void handler(error_code ec, size_t length);

事实上,应用程序可能需要传递某种应用环境(context)给这个completion handler,例如 this 指针。用 boost::bind, std::tr1::bind 或者C++0x的std::bind 等函数对象适配器来达到这个目的,不失为一种办法。

不幸的是,对于许多C++猿类来说, bind 代表了某种魔法。你在使用它时,如果稍有不慎,编译器就会给你一大堆编译错误,关键是你还不知道你错在哪儿。并且,根据我的经验,它的基本概念(有些函数参数预先被绑定,而有些则是在调用时才被绑定)的学习曲线非常陡峭。

为此,我画了一些图来解释 bind 是如何工作的。为了清晰,我对图中的语法作了一些简化(例如,省略函数调用操作符的参数类型),并且简化了 bind 的实现。最后,the examples are limited to those likely to be useful with Asio(译者注:这句根本不知道是什么意思好吗。。)。欢迎大家给我提建议和留言。


bind 可以用来将用户提供的需要一个参数的函数转换成不需要参数的函数对象。绑定的值(在这个例子中是123)存储在函数对象内并且会被自动传递给用户指定的函数:

bind plain function one var zero args

参数绑定也可以用于将类成员函数转换成零参数的函数对象。猿类们都知道,非静态成员函数需要一个隐式的 this 参数。这意味着需要绑定一个合适的类实例指针到这个函数对象:

bind member function one var zero args

相应地,隐式的 this 指针也可以显式地传递给需要一个参数的函数对象:

bind member function zero vars one arg

函数对象经常同时使用提前绑定的参数和调用时才提供的参数。这个可以用成员函数来实现:

bind member function one var one arg

当然也可以使用非成员函数:

bind plain function one var two args

有些时候函数对象被调用时会提供多余的参数,而这些参数是目标函数不需要的。bind 会自动忽略这些多余的参数:

bind plain function one var two args second ignored

这些多余的参数不需要一定在函数对象签名的最后:

bind plain function one var two args first ignored

最后, bind 还允许重新组织函数对象的参数顺序:

bind plain function one var two args reordered


翻译到此结束,不得不感慨C++的黑魔法真是够强大的。。当然,那句话还是要说的:由于译者水平有限,blablabla。。。

bind的函数意义:(bind是一种适配器)

常见的需求中经常使用for_each(begin,end,fun),如果想要for_each达到通用的目的,主要是fun传入的函数指针和函数对象的问题。bind的作用就是将要求不同参数个数的函数统一为你所需要参数列表个数的函数对象。


本文转载自:http://kelvinh.github.io/blog/2013/12/03/boost-bind-illustrated/

共有 人打赏支持
invictus_lee
粉丝 1
博文 141
码字总数 21423
作品 2
徐汇
程序员
boost::bind源码剖析(实例分析)

bind的本质:就是创建一个Functor对象(重载了operator()的类对象) 通过将多余的函数参数和函数指针存储为Funtor对象的成员变量,在调用operator()函数是,利用存储的函数指针和函数参数,返...

junanhonglei
2010/10/12
0
0
超小型的bind库--bi-bind

boost中有一个bind库, 可以说是一个最为实用的tools了, 但是它与boost结合的有些紧密,而且其中的一些功能并不是很常用,就算将它bcp出独立的库也是一个不小的负担。如果在你的项目中不打算...

蜗牛狂奔吧
2013/05/09
1K
0
boost::bind的使用方法

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

临峰不畏
2013/03/18
0
0
boost:bind使用指南

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

follitude
2016/08/04
8
0
Boost::Bind 源码实现简化版

本着看懂boost::bind整体流程的角度出发,将boost::bind的源码精简贴出,去除了所有多余部分,只在说明问题,错误在所难免,希望大家勿喷。 bindt对象就是boost::bind方法的返回值,它保存了...

yellia_c
2012/11/21
0
1

没有更多内容

加载失败,请刷新页面

加载更多

下一页

python3.6 取余运算

python中取余运算逻辑如下: 如果a 与d 是整数,d 非零,那么余数 r 满足这样的关系: a = qd + r , q 为整数,且0 ≤ |r| < |d|。 经过测试可发现,python3.6中取余运算得到的 r 是正整数;...

colinux
16分钟前
1
0
[雪峰磁针石博客]软件测试专家工具包1web测试

web测试 本章主要涉及功能测试、自动化测试(参考: 软件自动化测试初学者忠告) 、接口测试(参考:10分钟学会API测试)、跨浏览器测试、可访问性测试和可用性测试的测试工具列表。 安全测试工具...

python测试开发人工智能安全
今天
3
0
JS:异步 - 面试惨案

为什么会写这篇文章,很明显不符合我的性格的东西,原因是前段时间参与了一个面试,对于很多程序员来说,面试时候多么的鸦雀无声,事后心里就有多么的千军万马。去掉最开始毕业干了一年的Jav...

xmqywx
今天
3
0
Win10 64位系统,PHP 扩展 curl插件

执行:1. 拷贝php安装目录下,libeay32.dll、ssleay32.dll 、 libssh2.dll 到 C:\windows\system32 目录。2. 拷贝php/ext目录下, php_curl.dll 到 C:\windows\system32 目录; 3. p...

放飞E梦想O
今天
1
0
谈谈神秘的ES6——(五)解构赋值【对象篇】

上一节课我们了解了有关数组的解构赋值相关内容,这节课,我们接着,来讲讲对象的解构赋值。 解构不仅可以用于数组,还可以用于对象。 let { foo, bar } = { foo: "aaa", bar: "bbb" };fo...

JandenMa
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部