函式物件
函式 物件或 函式工具,為任何型別實作運算子 ()。 這個運算子稱為 呼叫運算子 或有時候 應用程式運算子。 標準樣板程式庫使用函式物件主要做為排序準則為容器和在演算法。
函式物件提供兩個主要好處多直線的函式呼叫。 第一個是函式物件可能包含狀態。 第二個是函式物件是型別也可以當做樣板參數。
建立函式物件
若要建立函式物件,請建立型別並實作 operator(),例如:
class Functor
{
public:
int operator()(int a, int b)
{
return a < b;
}
};
int main()
{
Functor f;
int a = 5;
int b = 7;
int ans = f(a, b);
}
main 函式的最後一行顯示如何呼叫函式物件。 這個呼叫看起來與呼叫函式,不過,它確實呼叫功能子型別的 operator() 。 在呼叫函式物件和函式之間的相似處是這個詞彙函式物件的外觀。
函式物件和容器
標準樣板程式庫在 <functional> 標頭檔包含數個函式物件。 這些函式物件的一個用法是當做容器的排序準則。 例如, set 容器宣告如下:
template <
class Key,
class Traits=less<Key>,
class Allocator=allocator<Key> >
class set
第二個樣板引數是函式物件 less。 這個函式物件則傳回 true ,如果第一個參數傳遞給它是第二個參數傳遞的小於。 因為有些容器排序其項目,容器需要比較兩個項目的方式,因此,使用這個函式物件成功。 您可以建立函式物件和指定它定義您容器本身排序準則在範本清單中的容器。
函式物件和演算法。
對功能物件的另一個用於演算法。 例如, remove_if 演算法宣告如下:
template<class ForwardIterator, class Predicate>
ForwardIterator remove_if(
ForwardIterator _First,
ForwardIterator _Last,
Predicate _Pred
);
對 remove_if 的最後一個引數是傳回布林值的函式物件 ( 述詞)。 如果函式物件的結果是 true,則這個項目從 Iterator 存取容器移除 _First 和 _Last。 您可以在 <functional> 標頭可用於宣告的任何函式物件為引數 _Pred 或自行建立。