Share via


函式物件

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或建立您自己。

請參閱

參考

標準樣板程式庫