1、 std::function
类模板 std::function 是一个通用的多态函数包装器。当做函数指针。
2、function类模板
1 template< class R, class... Args > 2 class function< R (Args...)>
说明:R是被调用函数的返回类型 Args....是被调用的函数的形参。
function是类模板,只有成员函数,没有数据成员。
3、用法
3.1 调用普通函数
#include <functional> #include <iostream> int f(int a, int b) { return a+b; } int main() { std::function<int(int, int)>func = f; cout<<func(1, 2)<<endl; // 3 system("pause"); return 0; }
说明:模板类必须实例化使用,上面实例化后对象名 func,对象func可以指向的函数是有两个int参数,返回值是int的函数,函数f满足。调用也只需func( 1,2 )实现调用。
3.2 调用函数对象
#include<iostream> using namespace std; //function object struct functor { public: int operator() (int a, int b) { return a + b; } }; int main() { functor ft; function<int(int,int)> func = ft(); cout<<func(1,2)<<endl; //3 return 0; }
3.3 调用模板函数对象
#include<iostream> using namespace std; //function object template<class T> struct functor { public: T operator() (T a, T b) { return a + b; } }; int main() { functor ft; function<int(int,int)> func = ft<int>(); cout<<func(1,2)<<endl; //3 return 0; }
3.4 调用lambda表达式
#include <functional> #include <iostream> using namespace std; int main() { auto f = [](const int a, const int b) {return a + b; }; std::function<int(int, int)>func = f; cout << func(1, 2) << endl; // 3 system("pause"); return 0; }
3.5 调用类静态成员函数
#include <iostream> #include <functional> using namespace std; class Plus { public: static int plus(int a, int b) { return a + b; } }; int main() { function<int(int, int)> f = &Plus::plus; cout << f(1, 2) << endl; //3 system("pause"); return 0; }
3.6 调用类成员函数
#include <iostream> #include <functional> using namespace std; class Plus { public: int plus(int a, int b) { return a + b; } }; int main() { Plus p; function<int(Plus&,int, int)> f = &Plus::plus; //function<int(const Plus,int, int)> f = &Plus::plus; cout << f(p,1, 2) << endl; //3 system("pause"); return 0; }
3.7 调用类公有数据成员
#include <iostream> #include <functional> using namespace std; class Plus { Plus(int num_):num(num_){} public: int plus(int a, int b) { return a + b; } int num; }; int main() { const Plus p(2); function<int(const Plus&)> f = &Plus::num; //function<int(const Plus)> f = &Plus::num; cout << f(p) << endl; //2 system("pause"); return 0; }
3.8 通过bind函数调用类成员函数
#include <iostream> #include <functional> using namespace std; class Plus { public: int plus(int a, int b) { return a + b; } }; int main() { Plus p; // 指针形式调用成员函数 function<int(int, int)> f = bind(&Plus::plus, &p, placeholders::_1, placeholders::_2);// placeholders::_1是占位符 // 对象形式调用成员函数 function<int(int, int)> f1 = bind(&Plus::plus, p, placeholders::_1, placeholders::_2);// placeholders::_1是占位符 cout << f(1, 2) << endl; //3 cout << f1(1, 2) << endl; //3 system("pause"); return 0; }
参考:
博客 [ https://blog.csdn.net/qq_35721743/article/details/83217416?utm_medium=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.edu_weight&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.edu_weight ]