STL教程(十四): 函数对象-- std::function
一、介绍
template< class R, class... Args > class function<R(Args...)>;
-
类模板 std::function 是通用的多态函数包装器。 std::function 的实例能够存储、复制及调用任何符合可调用 (Callable)、可拷贝的(CopyConstructible )目标——普通函数、 lambda 表达式、 成员函数指针、bind 表达式或其他函数对象。 它也是对 C++ 中现有的可调用实体的一种类型安全的包裹(相对来说,函数指针的调用不是类型安全的) 如果std::function未包装任何函数对象而被调用,则系统会抛出 std::bad_function_call异常
二、代码示例
1、全局函数
(1)普通函数
#include <iostream> #include <functional> using namespace std; int g_Minus(int i, int j) { return i - j; } int main() { function<int(int, int)> f = g_Minus; cout << f(1, 2) << endl; // -1 return 1; }
(2)模板函数
#include <iostream> #include <functional> using namespace std; template <class T> T g_Minus(T i, T j) { return i - j; } int main() { function<int(int, int)> f = g_Minus<int>; cout << f(1, 2) << endl; // -1 return 1; }
2、lambda表达式
#include <iostream> #include <functional> using namespace std; auto g_Minus = [](int i, int j){ return i - j; }; int main() { function<int(int, int)> f = g_Minus; cout << f(1, 2) << endl; // -1 return 1; }
3、函数对象
(1)普通函数对象
#include <iostream> #include <functional> using namespace std; struct Minus { int operator() (int i, int j) { return i - j; } }; int main() { function<int(int, int)> f = Minus(); cout << f(1, 2) << endl; // -1 return 1; }
(2)模板函数对象
#include <iostream> #include <functional> using namespace std; template <class T> struct Minus { T operator() (T i, T j) { return i - j; } }; int main() { function<int(int, int)> f = Minus<int>(); cout << f(1, 2) << endl; // -1 return 1; }
4、类静态成员函数
(1)普通类静态成员函数
#include <iostream> #include <functional> using namespace std; class Math { public: static int Minus(int i, int j) { return i - j; } }; int main() { function<int(int, int)> f = &Math::Minus; cout << f(1, 2) << endl; // -1 return 1; }
(2)普通模板类静态成员函数
#include <iostream> #include <functional> using namespace std; class Math { public: template <class T> static T Minus(T i, T j) { return i - j; } }; int main() { function<int(int, int)> f = &Math::Minus<int>; cout << f(1, 2) << endl; // -1 return 1; }
5、类成员函数
(1)普通类成员函数
#include <iostream> #include <functional> using namespace std; class Math { public: int Minus(int i, int j) { return i - j; } }; int main() { Math m; function<int(int, int)> f = bind(&Math::Minus, &m, placeholders::_1, placeholders::_2); cout << f(1, 2) << endl; // -1 return 1; }
(2)模板类成员函数
#include <iostream> #include <functional> using namespace std; class Math { public: template <class T> T Minus(T i, T j) { return i - j; } }; int main() { Math m; function<int(int, int)> f = bind(&Math::Minus<int>, &m, placeholders::_1, placeholders::_2); cout << f(1, 2) << endl; // -1 return 1; }