转自:http://www.cnblogs.com/sld666666/archive/2010/12/14/1905980.html

这篇文章介绍boost::bind()的用法, 文章的主要内容是参考boost的文档。

1. 目的

boost::bind 是std::bindlist 和 std::bind2nd的结合体。它提供一个任意的函数对象(仿函数)、函数、函数指针、成员函数指针。 它可以绑定任意的参数。bind 没有对函数对象有任何的要求。

2. 把bind()用在函数和函数指针上

有如下代码:


1 void f(int a, int b)
2 {
3 cout << a + b << endl;
4 }
5  void g(int a, int b, int c)
6 {
7 cout << a + b + c << endl;;
8 }

当调用boost::bind(f, 1, 2);的时候, 它会产生一个空的函数对象,这个对象没有参数, 返回 f(1,2).当然我们也可以给它加个参数:

1 int a = 10;
2 boost::bind(f, _1, 5)(a);
3 int x(10),y(20),z(30);
4 boost::bind(g,_1,_2,_3)(x, y, z);

结果:

作为和std::bindlst的对比我们可以看下如下的代码:

1 std::bind1st(std::ptr_fun(f), 5)(x);   // f(5, x)
2 boost::bind(f, 5, _1)(x); // f(5, x)

是不是boost::bind()简单多了。

3. 把bind()用在函数对象(仿函数)上

bind()不仅能够用在函数上,而且可以接受任意的函数对象(仿函数)。如:


 1 class F
2 {
3 public:
4 int operator()(int a, int b)
5 {
6 cout << a+b <<endl;
7 return a+b;
8 }
9 double operator()(double a, double b)
10 {
11 cout << a+b<< endl;
12 return a +b;
13 }
14 };
15 int _tmain(int argc, _TCHAR* argv[])
16 {
17 F f;
18 int a[] = {1, 2, 3, 4, 5, 6,7};
19 double aDouble[] = {1.1, 2.2, 3.3, 4.4,5.5,6.6,7.7};
20 for_each(a, a+7, boost::bind<int>(f, _1, _1));
21 for_each(aDouble, aDouble+7, boost::bind<double>(f, _1, _1));
22 return 0;
23 }

4. 把bind()用在成员变量和成员函数上

指向成员变量的指针和指向成员函数的指针和仿函数不一样, 因为他们没有提供operater()。boost用它的第一个参数接受类成员的指针,这样就像用boost::mem_fn()把类成员的指针转化为仿函数一样。如:

bind(&X::f, args)

就等于

bind<R>(mem_fn(&X::f), args)//R 是x::f的返回值。
列如:

 1 struct X
2 {
3 bool f(int a)
4 {
5 cout << a <<endl;
6 return static_cast<bool>(a);
7 }
8 };
9 int _tmain(int argc, _TCHAR* argv[])
10 {
11 X x;
12 boost::shared_ptr<X> p(new X);
13 int i = 5;
14 boost::bind(&X::f, &x, _1)(i); // (&x)->f(i);
15 boost::bind(&X::f, x, _1)(i); //(copy x).f(i);
16 boost::bind(&X::f, p, _1)(i); //(copy p)->f(i);
17 return 0;
18 }

boost::bind()的基本用法就这些, 在使用的过程中发现确实比较爽, 但是这不知道这是不是常常被人批判的语法糖。

(转)boost::bind介绍的更多相关文章

  1. boost::bind 介绍

    boost::bind 介绍   这篇文章介绍boost::bind()的用法, 文章的主要内容是参考boost的文档. 1. 目的 boost::bind 是std::bindlist 和 std: ...

  2. boost::function和boost::bind 介绍

    一. boost::function介绍 原文:http://www.cnblogs.com/sld666666/archive/2010/12/16/1907591.html 本片文章主要介绍boo ...

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

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

  4. 手把手教你实现boost::bind

    前言 boost::bind操作想必大家都使用过,它特别神奇,能够绑定函数与参数,绑定后能够改变参数数量,并且还可以使用占位符.它可以绑定普通函数也可以绑定类成员函数.好多小伙伴试图看过boost:: ...

  5. boost::function 介绍

    本片文章主要介绍boost::function的用法. boost::function 就是一个函数的包装器(function wrapper),用来定义函数对象. 1.  介绍 Boost.Func ...

  6. boost asio 学习(二)了解boost::bind

    2.了解boost::bind使用boost::bind封装一个函数,考虑以下例子示例2a #include <iostream> #include <boost/bind.hpp& ...

  7. boost::bind的简单实现

    前言 在上一篇blog中简单的实现了boost::function,支持带有2个参数的函数/函数指针,函数对象,函数适配器/bind类,以及带有1个参数的成员函数指针. 本文接着来介绍如何实现一个简单 ...

  8. 1,Boost -> Bind

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

  9. boost::bind

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

随机推荐

  1. C#学习笔记——面向对象、面向组件以及类型基础

    C#学习笔记——面向对象.面向组件以及类型基础 目录 一 面向对象与面向组件 二 基元类型与 new 操作 三 值类型与引用类型 四 类型转换 五 相等性与同一性 六 对象哈希码 一 面向对象与面向组 ...

  2. Windows 环境下基于 nginx 的本地 PyPI 源

    Windows 环境下基于 nginx 的本地 PyPI 源的搭建: 1.登录 nginx 官网,下载安装包

  3. MySQL中UNION和UNION ALL的使用

    在数据库中,UNION和UNION ALL关键字都是将两个结果集合并为一个,但这两者从使用和效率上来说都有所不同. MySQL中的UNION UNION在进行表链接后会筛选掉重复的记录,所以在表链接后 ...

  4. win2008下c#调用directshow问题

    打开摄像头时报错 网上查 说缺少qedit.dll,下载后注册也不行. 最后安装暴风影音,测试ok

  5. cocos2dx windows phone平台下CCLabelTTF自己主动换行的实现(2)

    前几天发过一篇文章说怎样实现wp8下的CCLabelTTF怎样自己主动换行,后来发现果如预料的那般.效果非常不好.主要是非等宽字体的情况下看着非常糟心.因此再改动了一版.效果要好非常多了. 详细实现事 ...

  6. android判断当前应用程序处于前台还是后台

    /**     *判断当前应用程序处于前台还是后台     *      * @param context * @return         */    public static boolean ...

  7. CSS字体大小设置时的参考(转)

    from:http://blog.sina.com.cn/s/blog_51cd580b0100gg6y.html font-size 设置的绝对关键字: 以下几个绝对字体大小的设置是有效的.当然他们 ...

  8. Debug Certificate expired on 11-5-8 上午 6:26

    好久没用电脑上的eclipse,今天新建了个安卓项目,发现报下面的错误:   后来得知: 是Debug证书过期所致. android应用必须经过签名证书进行数字签名后,才能安装,在开发调试阶段,默认情 ...

  9. 解决安装包在win7,win8系统下安装后运行没有管理员权限

    今天打包一个程序在客户机上安装运行:一直报没有管理员权限:客户机是win8系统:直接右键管理员身份运行则都可以:为了避免不让用户每次都这么麻烦:只有问哈群友和百度,终于找到解决方法: 第一步:项目属性 ...

  10. Spring JTA multiple resource transactions in Tomcat with Atomikos example--转载

    原文地址:http://www.javacodegeeks.com/2013/07/spring-jta-multiple-resource-transactions-in-tomcat-with-a ...