std::function和std::bind详解

std::function

std::function包含于头文件 #include中,可将各种可调用实体进行封装统一,包括

  1. 普通函数
  2. lambda表达式
  3. 函数指针
  4. 仿函数(functor 重载括号运算符实现)
  5. 类成员函数
  6. 静态成员函数

下面实例通过上述几种方式实现一个简单的比较两个数的大小的功能:

#include 
#include 

using namespace std;

std::function fun;

1.普通函数

//普通函数
bool compare_com(int a, int b)
{
    return a > b;
}

2.lambda表达式

//lambda表达式
auto compare_lambda = [](int a, int b){ return a > b;};

3.仿函数

//仿函数
class compare_class
{
public:
    bool operator()(int a, int b)
    {
        return a > b;
    }   
};

4.类成员函数(动态、静态)

//类成员函数
class compare
{
public:
    bool compare_member(int a, int b)
    {
        return a > b;
    }
    static bool compare_static_member(int a, int b)
    {
        return a > b;
    }
};

对应的main函数如下:

int main()
{
    bool result;
    fun = compare_com;
    result = fun(10, 1);
    cout << "普通函数输出, result is " << result << endl;

    fun = compare_lambda;
    result = fun(10, 1);
    cout << "lambda表达式输出, result is " << result << endl;

    fun = compare_class();
    result = fun(10, 1);
    cout << "仿函数输出, result is " << result << endl;

    fun = compare::compare_static_member;
    result = fun(10, 1);
    cout << "类静态成员函数输出, result is " << result << endl;

    类普通成员函数比较特殊,需要使用bind函数,并且需要实例化对象,成员函数要加取地址符
    compare temp;
    fun = std::bind(&compare::compare_member, temp, std::placeholders::_1, std::placeholders::_2);
    result = fun(10, 1);
    cout << "类普通成员函数输出, result is " << result << endl;

下面介绍一下std::bind函数

std::bind函数将可调用对象(开头所述6类)和可调用对象的参数进行绑定,返回新的可调用对象(std::function类型,参数列表可能改变),返回的新的std::function可调用对象的参数列表根据bind函数实参中std::placeholders::_x从小到大对应的参数确定。下面以仿函数绑定为例,实现功能:比较输入数是否小于3:

//bind函数
    std::function fun2;
    //返回新的可调用对象参数列表只有一个int,std::placeholders::_1表示compare_class()第一个参数
    fun2 = std::bind(compare_class(), 3, std::placeholders::_1);
    result = fun2(3);
    cout << "bind函数测试, result is " << result << endl;
    return 0;
}

这里重新写一个实例详细说明返回的新的std::function可调用对象的参数列表如何确定:

#include 
#include 

using namespace std;
struct Int 
{
    int a;
};

bool compare_com(struct Int a, float b)
{
    return a.a > b;
}

int main()
{
    Int a = {1};
    //placeholders::_1对应float, placeholders::_2对应struct Int所以返回值fun的类型为function
    std::function fun = bind(compare_com, placeholders::_2, placeholders::_1);
    bool result = fun(2.0, a);
    cout << "result is " << result << endl;
    return 0;
}


你可能感兴趣的:(C/C++)