C++11提供的一个类模板,用来包装各种形式类型的可调用实体(函数指针,普通函数,函数对象,lambda表达式,bind绑定的对象)
绑定成员函数:function<返回类型(类名&,参数列表)> func = &类名::成员函数
可以看作函数适配器,可以把可调用对象和现有的参数先绑到一块,生成一个新的可调用实体,可用function接收。
作用:可以把含多元参数的可调用对象转成一元、二元、少元的可调用对象。
在使用一些STL算法的时候,比如find_if,可以做到减元的效果。
绑定成员函数:bind(&类名::成员函数,this/某个对象,参数列表)
形式:[捕获列表](参数列表)->返回类型 { 函数体 } //[]{}至少有这俩
作用:可以减少参数,使得可以用一些STL算法,
int main() { const int size = 4; vector<string> arr{"paul","kobe","xiangle"}; auto lam = [size](const string& s){ return s.size() > 4; } find_if(arr.begin(),arr.end(),lam); }
#include <string> #include <vector> #include <algorithm> #include <functional> #include <iostream> using std::vector; using std::string; using std::function; using std::placeholders::_1; using std::cout; using std::endl; //仿函数 struct compare { bool operator()(const string & arr) { return arr.size() > 4; } }; bool coml(const string& s, int sizes) { return s.size() > sizes; } int main() { //使用函数对象,find_if vector<string> arr{"paul","kobe","xiangle"}; vector<string>::iterator point = find_if(arr.begin(), arr.end(), compare()); cout << *point << endl; //如果size参数化呢,那么find_if()只接受一个一元谓词, //(1)lambda const int size = 4; auto com = [size](const string& arry) { return arry.size() > size; }; point = find_if(arr.begin(), arr.end(), com); cout << *point << endl; //(2)bind function<bool(string)> func = bind(coml,_1,size); point = find_if(arr.begin(), arr.end(), func); cout << *point << endl; //function bind class A { public: int sum(int a, int b) { return a + b; } static int sum1(int a, int b) { return a + b; } }; A a; //function包装成员函数,静态成员函数。 function<int(A&,int, int)> f = &A::sum; f(a,1, 2); function<int(int, int)> f = &A::sum1; //bind绑定成员函数,静态成员函数 bind(&A::sum,&a, _1,2); bind(&A::sum1, _1, 2); }