不以物喜,不以己悲

C++11 bind和function用法

C++11 bind和function用法

function是一个template,定义于头文件functional中。通过function<int(int, int)>声明一个function类型,它是“接收两个int类型,返回一个int类型”的可调用对象(int (*p)(int, int))。

function的用法:

普通函数示例:

#include <iostream>
#include<functional>
using namespace std;
void printA(int a)
{
    cout << "值:" << a << endl;
}
int main()
{
    function<void(int)> func = printA;
    func(2);
    getchar();
}

保存lambda表达式:

int main()
{
    function<void(int)> func = [](int a) { cout << "值2:" << a << endl; };
    func(2);
    getchar();
}

成员函数:

#include <iostream>
#include<functional>
using namespace std;
class Foo
{
public:
    int num;
    Foo(int num)
        :num(num) {}
    void printA(int i) const
    {
        cout << this->num + i << endl;
    }
};
int main()
{
    function<void(const Foo&, int)> f = &Foo::printA;
    Foo foo(2);
    f(foo, 5);
    getchar();
}

bind的用法

可将bind函数看作是一个通用的函数适配器,它接受一个可调用对象,生成一个新的可调用对象来“适应”原对象的参数列表。

调用bind的一般形式:auto newCallable = bind(callable, arg_list);

其中,newCallable本身是一个可调用对象,arg_list是一个逗号分割的参数列表,对应给定的callable的参数。

示例:

#include <iostream>
#include<functional>
using namespace std;
class A
{
public:
    void fun_3(int k, int m)
    {
        cout << "print: k=" << k << ", m=" << m << endl;
    }
};
void fun_1(int x, int y, int z)
{
    cout << "print: x = " << x << ", y=" << y << ",z=" << z << endl;
}
void fun_2(int& a, int& b)
{
    a++;
    b++;
    cout << "print: a=" << a << ",b=" << b << endl;
}
int main()
{
    auto f1 = ::bind(fun_1, 2, 3, 5);
    f1();

    auto f2 = ::bind(fun_1, placeholders::_1, placeholders::_2, 3);
    //表示绑定函数fun的第三个参数为3,而fun的第一、二个参数分别由调用f2的第一、二个参数指定
    f2(3, 34);
    auto f3 = ::bind(fun_1, placeholders::_2, placeholders::_1, 3);
    //表示绑定函数fun的第三个参数为3,而fun的第一、二个参数分别由调用f3的第二、一个参数指定。
    f3(1, 2);

    int m = 2, n = 3;
    auto f4 = ::bind(fun_2, placeholders::_1, n); 
    f4(m);
    cout << "m=" << m << endl; //m=3 说明:bind对于不事先绑定的参数,通过std::placeholders传递的参数是通过引用传递的
    cout << "n=" << n << endl;// n=3 说明:bind对于预先绑定的函数参数是通过值传递的

    A a;
    auto f5 = ::bind(&A::fun_3, a, placeholders::_1, placeholders::_2);
    f5(10, 20);//调用a.fun_3(10, 20)

    std::function<void(int, int)> fc = ::bind(&A::fun_3, a, placeholders::_1, placeholders::_2);
    fc(10, 220);
    getchar();
}
posted @ 2021-07-06 14:03  这种人  阅读(202)  评论(0编辑  收藏  举报