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()的替代品, 当然比他们更强大更灵活

posted on 2014-10-15 15:46  墙头上一根草  阅读(422)  评论(0编辑  收藏  举报