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.2cto.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的專欄