您的位置:首页 > 编程语言 > C语言/C++

C++11之std::bind

2014-11-12 01:07 169 查看
std::bind原型声明

template< class F, class... Args >

/*unspecified*/ bind( F&& f, Args&&... args );

template< class R, class F, class... Args >

/*unspecified*/ bind( F&& f, Args&&... args );

将参数绑定到函数或者对象身上调用。

参数f是一个回调对象(可以是函数,函数指针,函数引用,指向成员函数的指针,指向数据成员的指针)。

args是绑定的参数,如果不需要绑定可以使用占位符_1,_2...来替换(_1,_2等需要引用命名空间std::placeholders),如果绑定了参数,每次调用回调对象就会使用这个参数,如果使用占位符,就可以通过它传递参数。

使用bind需要包含functional头文件。

// std::bind例子
#include <iostream>     // std::cout
#include <functional>   // std::bind

// a function: (also works with function object: std::divides<double> my_divide;)
double my_divide (double x, double y) {return x/y;}

struct MyPair {
  double a,b;
  double multiply() {return a*b;}
};

int main () {
  using namespace std::placeholders;    // adds visibility of _1, _2, _3,...

  // 新函数fn_five封装了my_divide,把my_divide的参数全部绑定,第一个参数参数是10,第二个参数是2,调用fn_five时就不需要给任何参数了
  auto fn_five = std::bind (my_divide,10,2);               // returns 10/2
  std::cout << fn_five() << '\n';                          // 5

  // 新函数只绑定一个参数,_1表示新函数的第一个参数,另外将参数2作为my_divide的第二个参数绑定,调用fn_half(10)实际上等于调用my_divide(10,2)
  auto fn_half = std::bind (my_divide,_1,2);               // returns x/2
  std::cout << fn_half(10) << '\n';                        // 5

  // 两个参数都不绑定,但是交换一下位置,调用fn_invert(10,2)等于调用my_divide(2,10)
  auto fn_invert = std::bind (my_divide,_2,_1);            // returns y/x
  std::cout << fn_invert(10,2) << '\n';                    // 0.2

  auto fn_rounding = std::bind<int> (my_divide,_1,_2);     // returns int(x/y)
  std::cout << fn_rounding(10,3) << '\n';                  // 3

  MyPair ten_two = {10,2};

  // binding members:
  auto bound_member_fn = std::bind (&MyPair::multiply,_1); // returns x.multiply()
  std::cout << bound_member_fn(ten_two) << '\n';           // 20

  auto bound_member_data = std::bind (&MyPair::a,ten_two); // returns ten_two.a
  std::cout << bound_member_data() << '\n';                // 10

  return 0;
}


bind和lambda表达式一样,默认都是传值的,如果想要用引用,需要ref或cref函数,后者是常引用,也都位于functional头文件。

auto g = bind(f, ref(a), cref(b).....)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: