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 ]