函式物件
A 函式物件,或 functor,是任何型別實作的 operator ()。 此運算子都稱為呼叫運算子 或有時候 應用程式運算子。 標準樣板程式庫會使用主要是作為排序準則的容器,然後在演算法的函式物件。
函式物件會提供兩個主要優點直線的函式呼叫。 第一種是函式物件可以包含的狀態。 第二個是函式物件是一種類型,因此可以當做樣板參數。
建立函式物件
若要建立函式物件,建立型別和實作 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函式會顯示您如何呼叫函式物件。 這個呼叫如下所示的函式的呼叫,但它實際上會呼叫 Functor 型別的 operator ()。 這個之間呼叫函式物件和函式的相似處是詞彙 function 物件的來源。
函式物件和容器
標準樣板程式庫包含數個函式物件,在<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或建立您自己。