Library 9. Bind
来源:互联网 发布:互联网大数据 百度百科 编辑:程序博客网 时间:2024/06/05 00:56
Bind 库如何改进你的程序?
使函数和函数对象适用于标准库算法
使用一致语法创建绑定器
强大的函数组合
在使用来自于标准库的算法时,你常常需要提供给它们一个函数或一个函数对象。这是对算法的行为进行定制的一个好方法,但你通常需要写一个新的函数对象,因为你没有组合函数或改变参数的顺序等所需的工具。虽然标准库已经提供了一些可用的工具,如bind1st 和 bind2nd, 但是这不够用。即使功能上够用了,但这通常意味着要忍受笨拙的语法,这些语法通常会让不熟悉这些工具的程序员产生混乱。你需要的是一个解决方案,既具备所需功能,又可以使用普通的语法就地创建函数对象,这正是 Boost.Bind 所要做的。
事实上,泛型绑定器是一种 lambda 表达式,因为通过函数组合,我们可以或多或少在调用点构造一个局部的、无名的函数。在许多情形下这都是需要的,因为它达到了三个目的:减少了代码的数量,使代码更易懂,还有行为的局部化,这意味着更有效的维护。注意,还有另一个 Boost 库,Boost.Lambda, 它具有更多的特性。Boost.Lambda 将在下一章中讨论。为什么你不直接跳到下一个库?因为多数情况下,Boost.Bind 可以完成你要绑定的所有东西,并且学习曲线没那么陡。
Bind 成功的一个关键是采用统一的语法来创建函数对象,以及对于使用该库的类型只有很少的要求。这种设计使得无需关注如何去写与你的类型一起工作的代码,而只需关注我们最关心的一点,代码如何工作以及它实际上做了什么。使用来自标准库的适配器时,如ptr_fun 和 mem_fun_ref, 代码很容易变得过分冗长,因为我们必须提供这些适配器以便参数可以符合算法的要求。在 Boost.Bind 里不是这样的,它使用了更为精妙的推断系统,并且在自动推断不能适用时提供了一个简单的语法。使用 Bind 的结果就是,你可以写更少的代码,而且代码更易懂。
Bind 如何适用于标准库?
概念上,Bind 是已有的标准库函数 bind1st 和bind2nd 的泛化,其额外的功能就是允许更为精妙的函数组合。它还减少了对函数指针和类成员指针使用适配器的需要,从而缩短了代码,也减少了出错的机会。Boost.Bind 还包含了对C++标准库的一些常用的扩充,如SGI扩充的compose1 和 compose2, 还有select1st 和 select2nd 函数。因此,Bind 非常适用于标准库,而且它也真的非常好用。这些功能被公认为是需要的,最终将被引入到标准库中,也是对STL的扩展。Boost.Bind 已经被即将发布的 Library Technical Report 所接纳。
Bind
头文件: "boost/bind.hpp"
Bind 库创建函数对象来绑定到一个函数(普通函数或成员函数)。不需要直接给出函数的所有参数,参数可以稍后给,这意味着绑定器可以用于创建一个改变了它所绑定到的函数的 arity (参数数量) 的函数对象,或者按照你喜欢的顺序重排参数。
函数 bind 的重载版本的返回类型是未指定的,即不能保证返回的函数对象的特征是怎样的。有时,你需要将对象存于某处,而不是直接把它传送给另一个函数,这时,你要使用 Boost.Function, 它在 "Library 11:Function 11." 中讨论。弄明白 bind 函数返回的是什么的关键在于,理解它发生了什么转换。用bind 函数的一个重载,template<class R, class F> unspecified-1 bind(F f)来作为例子,返回类型就是 (引用自在线文档),"一个函数对象l ,表达式 l(v1, v2, ..., vm) 等同于 f(),隐式转换为 R"。这样,这个被绑定的函数就被保存在绑定器里面,以后对这个函数对象的调用就会得到被绑定的函数的返回值(如果有),即模板参数R. 我们在这讨论的实现支持最多九个函数参数。
Bind 的实现包括许多函数和类,但作为用户来说,我们不直接使用除了重载函数 bind以外的任何东西。所有绑定通过 bind 函数发生,我们可以无须依赖于返回值的类型。使用bind 时,参数占位符(命名为 _1,_2, 等等)不需要用一个using声明或using指示来引入,因为它们位于匿名名字空间。这样,在使用 Boost.Bind时,没有理由写出以下的代码。
using boost::bind;using namespace boost;
前面曾经提到过,当前的 Boost.Bind 实现支持九个占位符(_1,_2, _3, 等等),也就是说最多九个参数。粗略地过一下大纲对于深入理解如何进行类型推断是有好处的,还可以知道何时/为何它不总是可以工作的。花点时间分析一下成员函数指针与普通函数的署名特征也是很有用的。你将会看到对于普通函数和类成员函数,各有各的重载版本。还有,对于每一个数量的参数,也都有不同的重载。我不在这里列出所有大纲了,建议你到www.boost.org参考一下 Boost.Bind 的文档。
在以下情形时使用 Bind :
你需要绑定一个调用到一个普通函数,使用部分或全部参数
你需要绑定一个调用到一个成员函数,使用部分或全部参数
你需要嵌套组合函数对象
泛化绑定器的存在对于编写简洁、连贯的代码非常有用。它减少了为了适配函数/函数对象以及函数组合而创建的小函数对象的数量。虽然标准库已经提供了 Boost.Bind 的一小部分功能,但是 Boost.Bind 所具有的重大改进使得它在多数情况下成为了更好的选择。除了对已有功能进行简化外,Bind 还提供了强大的函数组合功能,这为程序员提供了强大的力量而且没有维护上的负作用。如果你已经花了时间学习bind1st, bind2nd,ptr_fun, mem_fun_ref, 等等,那么转换到 Boost.Bind 对你而言几乎没有困难。如果你已经开始使用C++标准库所提供的绑定器,我强烈建议你开始使用 Bind, 因为它更容易学习,而且更强大。
我知道许多程序员通常都有绑定器的经验,特别是函数组合。如果你用过其中之一,我希望本章能够为你提供某些动力,推动你更进一步。此外,回想一下这种就地声明并定义的函数意味着什么,它意味着无需维护。仅仅为了提供正确的署名和执行简单的小任务而在类的周围创建一堆小的、看起来很简单的[8]函数对象,会导致代码的分散,与之相比,使用绑定器更容易。
[8] 但它们并不是那么简单。
Boost.Bind 库由 Peter Dimov 创建并维护,他除了令这个库实现了完整的绑定和函数组合功能之外,还令它可以很好地工作在多数编译器环境下。
- Library 9. Bind
- bind()
- bind()
- Bind
- bind
- bind
- bind
- bind
- bind
- bind
- bind()
- bind()
- Library
- library
- library
- Library
- boost.bind 如何 bind
- boost.bind 如何 bind
- Android日志文件及tcpdump抓包
- htonl大小端输出
- json遍历
- 创业新趋势:虚拟化
- VC_概念_JPEG文件数据结构以及将位图保存为JPG的代码
- Library 9. Bind
- sharepoint 2007 查询sspid
- c与c++编程思想上差别
- 优质的程序员需为代码效率而呕心沥血
- ORACLE日期时间函数大全
- coreseek 中文分词+精准 应用
- winform 取消datagridview第一行选中状态
- C C++之对比
- Boost.Bind用法详解(一)