1.函数包装器

/*
    1.包含functional
    2.作用: 把函数指针,函数对象,函数等,包装成一个对象
    3.function<type> object(functionObject);
        type:返回值类型(参数类型)
*/
int Max(int a, int b) 
{
    return a > b ? a : b;
}
using FucPTR = void(*)(int, int);
class  Test 
{
public:
    static void print(int a, int b) 
    {
        cout << a + b << endl;
    }
    void operator()(string str) 
    {
        cout << str << endl;
    }
    operator FucPTR() 
    {
        return print;
    }
};
template <class _Ty>
void printData(_Ty object,int a,int b) 
{
    cout << object(a, b) << endl;;
}
int main() 
{
    //1.包装普通函数
    function<int(int, int)> fMax(Max);
    cout << fMax(2, 3) << endl;
    //2.包装类的静态方法
    function<void(int, int)> testPrint(Test::print);
    testPrint(1,2);
    //3.包装仿函数
    Test test;
    function<void(string)> func=test;
    func("仿函数");
    //4.包装转换成函数指针的对象
    function<void(int, int)> func2 = test;
    func2(3,4);
    printData([](int a, int b) {return a + b; }, 1, 3);
    printData(fMax, 2, 3);
    return 0;
}

2.函数适配器

/*
     //bin1st bind2nd  淘汰了
     bind函数: 函数适配器,绑定一个参数,一般绑定,意味着这个参数就不需要传入,意味着这个参数不存在了
     不绑定可以用占位符表示, std::placeholders::_1 
     bind函数返回的是一个对象,类似函数包装器的对象,可以直接当做函数指针使用
*/
int  Max(int a, int b) 
{
    cout << a << endl;
    cout << b << endl;
    return a > b ? a : b;
}
class Test 
{
public:
    void printTest(int a, int b, int c) 
    {
        cout << "a=" << a << endl;
        cout << "b=" << b << endl;
        cout << "c=" << c << endl;
    }
};
void print(int a, double b, string c) 
{
    cout << a << endl;
    cout << b << endl;
    cout << c << endl;
}
int main() 
{
    //1.绑定普通函数
    auto pMax = bind(Max, std::placeholders::_1, 200);
    cout << pMax(1) << endl;;
    auto pMax2 = bind(Max, 2, 3);
    cout << pMax2() << endl;;
    //2.绑定类中的成员函数指针
    Test test;
    auto  testFunc = bind(&Test::printTest, &test, std::placeholders::_1, 22, 33);
    testFunc(11);
    //3.容器的一些算法常用
    vector<int> data = { 1,2,3,4,5,6,7,8,9 };
    cout << count_if(data.begin(), data.end(), 
        bind(greater<int>(),std::placeholders::_1,6))<<endl;
    cout << count_if(data.begin(), data.end(),
        [](int a, int b = 6) {return a > b; }) << endl;
    //4.结合函数包装器实现不同形态的包装对象
    //4.1 正常包装
    function<void(int, double, string)> f1 = print;
    f1(1, 1.11, "正常包装");
    //4.2 正常的适配与包装
    function<void(int, double)> f2 = bind(print, placeholders::_1, placeholders::_2, "正常适配");
    f2(2,2.2);
    //4.3调整参数顺序进行绑定
    //void print(int a, double b, string c) 
    auto  f3 = bind(print, placeholders::_2, placeholders::_1, "调整参数");
    f3(3.3, 3);
    function<void(double,int)>  f4 = bind(print, placeholders::_2, placeholders::_1, "调整参数");
    f4(3.3, 3);
    //4.4 调整所有参数
    function<void(string, int, double)> f5 = bind(print, 
        placeholders::_2, placeholders::_3, placeholders::_1);
    f5("调整所有参数", 4, 4.4);
    //bind主要使用在回调函数中
    return 0;
}