> 文章列表 > std::function的用法

std::function的用法

std::function的用法

一.简介

std::function是一个函数包装模板,可以包装下列这几种可调用元素类型:函数、函数指针、类成员函数指针或任意类型的函数对象(例如定义了operator()操作并拥有函数闭包)。std::function对象可被拷贝和转移,并且可以使用指定的调用特征来直接调用目标元素。当std::function对象未包裹任何实际的可调用元素,调用该std::function对象将抛出std::bad_function_call异常

二.用法

  • 包装普通函数
  • #include <iostream>
    #include <functional>
    using namespace std;int add(int i, int j)
    {return i - j;
    }int main()
    {function<int(int, int)> f = add;cout << f(1, 2) << endl;                        return 1;
    }
    
  • 包装模板函数
  • #include <iostream>
    #include <functional>
    using namespace std;template <class T>
    T add(T i, T j)
    {return i + j;
    }int main()
    {function<int(int, int)> f = add<int>;cout << f(1, 2) << endl;             return 1;
    }
    
  • 包装lambda表达式
  • #include <iostream>
    #include <functional>
    using namespace std;auto add = [](int i, int j){ return i + j; };int main()
    {function<int(int, int)> f = add;cout << f(1, 2) << endl;     return 0;
    }
    
  • 包装函数对象
  • 非模板类型
  • #include <iostream>
    #include <functional>
    using namespace std;class Add
    {
    public:int operator() (int i, int j){return i + j;}
    };int main()
    {function<int(int, int)> f = Add();//函数对象相对上面的函数,加了()cout << f(1, 2) << endl;                               return 1;
    }
    

    模板类型

  • #include <iostream>
    #include <functional>
    using namespace std;template <typename T>
    class Add
    {T operator() (T i, T j){return i + j;}
    };int main()
    {function<int(int, int)> f = Add<int>();cout << f(1, 2) << endl;                                   return 1;
    }
    

    - 包装类静态成员函数

  • #include <iostream>
    #include <functional>
    using namespace std;class Math
    {
    public:static int Minus(int i, int j){return i - j;}
    };//模板类型
    template<typename T>
    class Math
    {
    public:static T Minus(T i, T j){return i - j;}
    };int main()
    {function<int(int, int)> f = &Math::Minus;function<int(int, int)> f = &Math<int>::Minus;cout << f(1, 2) << endl;                                        return 1;
    }
  • 包装类对象成员函数
  • #include <iostream>
    #include <functional>
    using namespace std;template <typename T>
    class Math
    {
    public:template <typename T1>T Minus(T i, T j){return i - j;}
    };int main()
    {Math<int> m;function<int(int, int)> f = bind(&Math<int>::Minus<int>, &m, placeholders::_1, placeholders::_2);cout << f(1, 2) << endl;                                            // -1return 1;
    }