http://kelvinh.github.io/blog/2013/12/03/boost-bind-illustrated/

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

记得在刚开始看到 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)存储在函数对象内并且会被自动传递给用户指定的函数:

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

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

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

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

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

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

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


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

[转] [翻译]图解boost::bind的更多相关文章

  1. 使用BOOST BIND库提高C++程序性能

    Boost.Bind为函数和函数对象,值语义和指针提供语义了一致的语法.我们首先通过一些简单的例子来看看它的基本用法,之后我们会延伸到嵌套绑定以实现功能组合.理解bind用法的一个关键是理解占位符(p ...

  2. 1,Boost -> Bind

    #include <boost/bind.hpp> #include <boost/shared_ptr.hpp> #include <iostream> usin ...

  3. boost::bind

    bind并不是一个单独的类或函数,而是非常庞大的家族,依据绑定的参数个数和要绑定的调用对象类型,总共有十个不同的形式,但它们的名字都叫bind. bind接受的第一个参数必须是一个可调用对象f,包括函 ...

  4. boost::bind 和 boost::function 基本用法

    这是一篇介绍bind和function用法的文章,起因是近来读陈硕的文章,提到用bind和function替代继承,于是就熟悉了下bind和function的用法,都是一些网上都有的知识,记录一下,期 ...

  5. 以boost::function和boost:bind取代虚函数

    转自:http://blog.csdn.net/Solstice/archive/2008/10/13/3066268.aspx 这是一篇比较情绪化的blog,中心思想是“继承就像一条贼船,上去就下不 ...

  6. (转)boost::bind介绍

    转自:http://www.cnblogs.com/sld666666/archive/2010/12/14/1905980.html 这篇文章介绍boost::bind()的用法, 文章的主要内容是 ...

  7. boost::bind实践2——来自《Beyond the C++ Standard Library ( An Introduction to Boost )》

    直接代码: 代码段1: #include <iostream> #include <string> #include <boost/bind/bind.hpp> c ...

  8. boost::bind实践

    第一部分源码为基础实践: /*Beyond the C++ Standard Library ( An Introduction to Boost )[CN].chm*/ /*bind的用法*/ #i ...

  9. 关于boost::function与boost::bind函数的使用心得

    最近开始写一个线程池,期间想用一个通用的函数模板来使得各个线程执行不同的任务,找到了Boost库中的function函数. Boost::function是一个函数包装器,也即一个函数模板,可以用来代 ...

随机推荐

  1. 初涉JavaScript模式 (3) : 字面量

    什么是字面量? 在编程语言中,字面量是一种表示值的记法.例如,"Hello, World!" 在许多语言中都表示一个字符串字面量(string literal ),JavaScri ...

  2. Communication System

    poj1018:http://poj.org/problem?id=1018 题意:某公司要建立一套通信系统,该通信系统需要n种设备,而每种设备分别可以有m1.m2.m3.....mn个厂家提供生产, ...

  3. iOS之H5和Native混合开发

    今天需要用到一个H5和Native 混合开发的项目,简单的写一点入门的东西,很简答: 先介绍一下简单的配置步骤: 1.新建项目:SB拖一个UIWebView 按住Ctrl 拖线delegate 设置为 ...

  4. Volatile vs. Interlocked vs. lock

    今天在stackoverflow上看到一个关于Volatile, Interlock, Lock的问题,发现回答的特别好,所以就想到把它翻译一下, 希望给那些对它们有疑惑的人提供点帮助 :假设有一个类 ...

  5. 【Linux】鸟哥的Linux私房菜基础学习篇整理(十)

    1. at [-mldv] TIME/at -c 工作号码:单一工作调度.参数:-m:当at的工作完成后,即使没有输出信息,以email通知用户该工作已完成:-l:相当于atq,列出目前系统上面的所有 ...

  6. java学习之数组(一)【内存】

    在java语言当中,为了更方便多个数据的管理,这里提供数组. 比如说,现在我们有一组数据,7,8,9,9,为了保存这四个数据,我们分别要定义变量来保存,少了还好说.但是假如,有100多个数据呢,我们一 ...

  7. 【无源汇上下界最大流】SGU 194 Reactor Cooling

    题目链接: http://acm.sgu.ru/problem.php?contest=0&problem=194 题目大意: n个点(n<20000!!!不是200!!!RE了无数次) ...

  8. 光学字符识别OCR

    1.功能: 光学字符识别(OCR,Optical Character Recognition)是指对文本资料进行扫描,然后对图像文件进行分析处理,获取文字及版面信息的过程 2.典型应用: 名片扫描 3 ...

  9. 移动UI自动化-Page Objects Pattern

    移动UI自动化,看起来美好,践行起来却难.做个目光短见的务实主义者.Page Objects Pattern是Selenium官方推崇的方式,最近研究写测试用例最佳实践之Page Objects,同时 ...

  10. Sentry Server 日志记录分析服务

    原文地址:http://blog.shanbay.com/archives/998 或许你不太会喜欢异常,特别是那些发生后继而沉默在应用日志里那些,你不知道从何开始,因为它们看起来并非那么平易近人,但 ...