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

c++ 11新特性之bind()与function

2014-10-15 15:46 531 查看
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()的替代品, 当然比他们更强大更灵活
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: