一.简介
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; }