美文网首页
谈function

谈function

作者: 404Not_Found | 来源:发表于2021-12-10 18:42 被阅读0次
  • 作者: 雪山肥鱼
  • 时间:20211211 11:23
  • 目的: 复习 function

function

语义:
类模板 std::function 是可调用对象的包装器,可以包装除了类成员函数之外的所有可调用对象。包括,普通函数,函数指针,lambda,放函数。
通过指定的模板参数,它可以用统一的方式保存,并延迟执行执行,即回调。

多态统一接口

  • 统一接口
    在之前 我们可以用多态统一接口。
#include <iostream>

using namespace std;

class Oper{

public:
    virtual int op(int x, int y) = 0;

};

class Add : public Oper {
public:
   int op()(int x, int y)  {
       return x +y;
   }

};

class Sub : public Oper{
public:
    int op()(int x, int y) {
        return x -y;
    }
};

int main(int argc, char *argv[])
{
    Add add;
    cout<<add.op(4,5)<<endl;

    Sub sb;
    cout<<sb.op(5, 4)<<endl;

    return 0;
}

function 统一接口

我们针对 函数,函数指针,lambda,仿函数分别举例。

#include <iostream>
#include <functional>
#include <map>

int add(int x, int y) {
    return x + y;
}

int sub(int x, int y) {
    return x -y;
}

typedef int(*SUB)(int x, int y);

class Div {
public:
    int operator()(int x, int y) {
        return x/y;
    }
};

int main(int argc,char **argv) {

    auto op = function<int(int, int)>(add);
    cout<<op(1,4)<<endl;

    SUB sb = sub;
    auto op1 = function<int(int, int)>(sb);
    cout<<op1(3,4)<<endl;

    auto op2 = function<int(int, int)>([](int x, int y){
        return x * y;
    });
    cout<<op2(3,4)<<endl;

    auto op3 = function<int(int, int)>(Div());
    cout<<op3(10, 2)<<endl;

    map<string, function<int(int, int)>> mp = {
    {"+", add}, //函数
    {"-", sb},  //函数指针
    {"/", op3}, // 仿函数
    {"*", op2}  //lambda
    };

    cout<<mp["+"](1,2)<<endl;
    cout<<mp["-"](1,2)<<endl;
    cout<<mp["/"](44,2)<<endl;
    cout<<mp["*"](10,2)<<endl;

    return 0;

}

简单应用

  • 做回调函数
#include <iostream>
#include <algorithm>
#include <functional>
#include <map>

void selectSort(int *p, int n, function<int(int, int)> compare) {
    for(int i = 0; i < n-1; i++) {
        for( int j = i+1; j<n;j++) {
            if(compare(p[i], p[j])) {
                p[i] ^= p[j];
                p[j] ^= p[i];
                p[i] ^= p[j];
            }
        }
    }
}

int main(int argc, char ** argv) {
    int arr[] = {1,3,5,7,9,2,4,6,8,10};
    selectSort(arr, sizeof(arr)/sizeof(*arr), [](int x, int y){return x > y;});

    for_each(arr, arr+10, [](int &i) {
        cout <<i<<endl;
    });
    return 0;
}
  • 类成员回调
class FunA {
public:
    void operator()() {
        cout <<"class function A"<<endl;
    }
};
class FunB {
public:
    void operator()() {
        cout <<"class function B"<<endl;
    }
};
class FunC {
public:
    void operator()() {
        cout <<"class function C"<<endl;
    }
};

class Obj {
public:
    Obj(FunA a, FunB b, FunC c) {
        _list.push_back(a);
        _list.push_back(b);
        _list.push_back(c);
    }

    void notify() {
        for(auto &item:_list) {
            item();
        }
    }

private:
    list<function<void(void)>> _list;
};

int main(int argc, char ** argv) {
    FunA a;
    FunB b;
    FunC c;

    //可以推任何可调用对象
    Obj ob(a, b, c);
    ob.notify();
    return 0;
}

相关文章

网友评论

      本文标题:谈function

      本文链接:https://www.haomeiwen.com/subject/cpjkfrtx.html