zoukankan      html  css  js  c++  java
  • (转)boost::bind介绍

    转自: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);

        结果:

    image

        作为和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()的基本用法就这些, 在使用的过程中发现确实比较爽, 但是这不知道这是不是常常被人批判的语法糖。

  • 相关阅读:
    leetcode 350. Intersection of Two Arrays II
    leetcode 278. First Bad Version
    leetcode 34. Find First and Last Position of Element in Sorted Array
    leetcode 54. Spiral Matrix
    leetcode 59. Spiral Matrix II
    leetcode 44. Wildcard Matching
    leetcode 10. Regular Expression Matching(正则表达式匹配)
    leetcode 174. Dungeon Game (地下城游戏)
    leetcode 36. Valid Sudoku
    Angular Elements
  • 原文地址:https://www.cnblogs.com/buptlyn/p/4517970.html
Copyright © 2011-2022 走看看