#include<iostream>
using namespace std;
class absInt{
public:
int operator()(int val)/*函数调用操作符*/
{
return val<0?-val:val;
}
};
int main(){
int i=-41;
absInt absObj;
int ui=absObj(i);
cout<<ui<<endl;
return 0;
}
可以为类类型的对象重载函数调用操作符。通过为类类型的对象提供一个实参表而使用调用操作符,所用的方式看起来像一个函数调用。
尽管absObj是一个对象而不是一个函数,仍然可以“调用”该对象,效果是运行由absObj对象定义的重载调用操作符,该操作符接受一个int值并返回它的绝对值。
函数调用操作符必须声明为成员函数。一个类可以定义函数调用操作符的多个版本,由形参的数目或类型加以区别。
定义了调用操作符的类,其对象称为“函数对象”,即它们是行为类似于函数的对象。
标准库定义了一组算术,关系与逻辑函数对象类。定义在functional头文件中。
#include<iostream>
#include<functional>
using namespace std;
int main(){
plus<int> intAdd;
negate<int> intNegate;
int sum=intAdd(10,20);
cout<<sum<<endl;
sum=intAdd(10,intNegate(10));
cout<<sum<<endl;
return 0;
}
标准库提供了一组函数适配器,用于特化和扩展一元和二元函数对象。分以下两类:
1.绑定器,将一个操作数绑定到给定值而将二元函数对象转换为一元函数对象
2.求反器,将谓词函数对象的真值求反。
标准库2个绑定器bind1st,bind2nd。每个绑定器接受一个函数对象和一个值。
标准库2个求反器not1,not2.not1将一元函数对象的真值求反,not2将二元函数对象的真值求反。