c++ 11新特性之bind()与function
bind()和function() 这两个函数在std的标准库中,提供c++对函数以及对象的控制
bind() 顾名思义就是“绑定” ,而bind()是和函数有关,所以就是绑定某个函数,请看一下代码
int f(int, char, double); auto ff = bind(f, _1, 'c', 1.2); // 绑定f()函数调用的第二个和第三个参数,返回一个新的函数对象为ff,它只带有一个int类型的参数 int x = ff(7); // f(7, 'c', 1.2);
我们无法使用bind()绑定一个重载函数的参数,我们必须显式地指出需要绑定的重载函数的版本
function() 是一个拥有任何可以以"(...)"符号进行调用的值的类型。特别地,bind的返回结果可以赋值给function类型。function十分易于使 用。(译注:更直观地,可以把function看成是一种表示函数的数据类型,就像函数对象一样。只不过普通的数据类型表示的是数据,function表 示的是函数这个抽象概念。),请看一下代码
function<float (int x, int y)> f; // 构造一个函数对象,它能表示的是一个返回值为float,两个参数为int,int的函数 struct int_div { // 构造一个可以使用"()"进行调用的函数对象类型 float operator() (int x, int y) const { return ((float)x)/y; }; }; f = int_div(); // 赋值 cout<< f(5,3) <<endl; // 通过函数对象进行调用 std::accumulate(b, e, 1, f); // 完美传递
成员函数可被看做是带有额外参数的自由函数,这个解释请看一下代码
struct X { int foo(int); }; function<int (X*, int)> f; // 所谓的额外参数,就是成员函数默认的第一个参数,也就是指向调用成员函数的对象的this指针 f = &X::foo; // 指向成员函数 X x; int v = f(&x, 5); // 在对象x上用参数5调用X::foo() function<int (int)> ff = std::bind(f, &x, _1); // f的第一个参数是&x v = ff(5); // 调用x.foo(5)
function对于回调函数、将操作作为参数传递等十分有用。它可以看做是C++98标准库中函数对象mem_fun_t, pointer_to_unary_function等的替代品。同样的,bind()也可以被看做是bind1st()和bind2nd()的替代品, 当然比他们更强大更灵活