当前位置:编程学习 > C/C++ >>

第14章 重载操作符与转换(7)

14.8 调用操作符和函数对象
struct absInt{
int operator() (int val){
return val<0?-val:val;
}
};
int i = 100;
absInt absObj;
cout<<absObj(i)<<endl;
函数调用操作符必须声明为成员函数。一个类可以定义为函数调用操作符的多个版本,由形参的数目或类型加以区别。
定义了调用操作符的类,其对象常称为函数对象(function object),即它们是行为类似函数的对象。
14.8.1 将函数对象用于标准库算法
函数对象经常用作通用算法的实参
1. 函数对象可以比函数更灵活
class GT_cls
{
public:
GT_cls(size_t val=0):bound(val){}
bool operator()(const string &s)
{
return s.size()>=bound;
}
private:
string::size_type bound;
};
2. 使用GT_cls函数对象
GT_cls gt(6);
cout<<gt(string("1231244"))<<endl;
14.8.2 标准库定义的函数对象
标准库还定义了一组函数适配器,使我们能够特化或者扩展标准库所定义的以及自定义的函数对象类。这些标准库函数对象类型是在functional头文件中定义的。
1.每个类表示一个给定操作符
有两个一元函数对象(unary function-object)类:一元减(negate<type>)和逻辑非(logical not<Type>)。其余的标准库函数对象都是表示二元操作符的二元函数对象(binary function-object)类。
2. 表示操作数类型的模板类型
plus<int> intadd;
cout<<intadd(1,2)<<endl;
3. 在算法中使用标准库函数对象
vector<int> vec;
sort(vec.begin(),vec.end(),greater<int>());
第三个实参用于传递比较元素的谓词函数。
14.8.3 函数对象的函数适配器
标准库提供ingke一组函数适配器(function adapter),用于特化和扩展一元和二元函数的对象。函数适配器分为如下两类:
(1)绑定器(binder),是一种函数适配器,它通过将一个操作数绑定到给定值而将二元函数对象转换为一元函数对象。
(2)求反器(negator),是一种函数适配器,它将谓词函数对象的真值求反。
标准库定义了两个绑定器适配器:bind1st和bind2nd。bind1st将给定值绑定到二元函数对象的第一个实参,bind2nd将给定值绑定到二元函数对象的第二个实参。
greater<int> gre;
cout<<gre(10,0)<<endl;                     //1
cout<<bind1st(greater<int>(),10)(0)<<endl; //1 www.zzzyk.com
cout<<gre(10,20)<<endl;                    //0
cout<<bind1st(greater<int>(),10)(20)<<endl;//0
标准库还定义了两个求反器:not1和not2。not1将一元函数对象的真值求反,not2将二元函数对象的真值求反。
cout<<not2(less<int>())(10,20)<<endl;    //0

摘自 xufei96的专栏

补充:软件开发 , C++ ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,