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