我们可以向算法传递任何类别的可调用对象:函数,函数指针,重载了函数调用运算符的类,lambda表达式,bind函数。
函数对象:
(1)如果类重载了函数调用运算符,则我们可以像使用函数一样使用该类的对象。因为这样的类同时也能存储状态,所以与普通函数相比他们更加灵活。
例: struct absInt{
int operator() (int) const
{return val<0 ?-val :val ;}
}
int i=42;
absint absobj;
int ui=absobj(i);
(2)函数调用运算符必须是成员函数。一个类可以定义多个不同版本的调用运算符,相互之间以重载的方式进行。
(3)函数对象常常作为泛型算法的实参
(4)lambda是函数对象:lambda表达式产生的类不含默认构造函数,赋值运算符及默认析构函数。
(5)标准库定义的函数对象
标准库定义了一组表示算术运算,关系运算符,逻辑运算符的类。每个类分别定义了一个执行命令操作的调用运算符。
function 模板, 生成可调用对象
声明:function<int (int ,int)> f1=add;
function<int(int ,int)> f2=divide();
function<int (int,int)> f3=[](int i, int j) {return i*j;} ;
应用:
cout<<f1(4,2)<<endl;
cout<<f2(4,2)<<endl;
cout<<f3(4,3)<<endl;