共用方式為


C++ 標準程式庫的函式物件

函式物件functor 是實作 operator()的任何類型。 這個運算子稱為 「呼叫運算子」 (Call Operator),有時也稱為 「應用運算子」(Application Operator)。 C++ 標準程式庫主要是將函式物件當作容器的排序準則來使用,以及用於演算法中。

函式物件比一般函數調用提供兩個主要優點。 第一個優點是函式物件可以包含狀態。 第二個優點是函式物件是一種類型,因此可以做為樣板參數。

建立函式物件

若要建立函式物件,請建立型別並實 operator()作 ,例如:

class LessThanFunctor
{
public:
    bool operator()(int a, int b)
    {
        return a < b;
    }
};

int main()
{
    LessThanFunctor less_than;
    int a = 5;
    int b = 7;
    bool ans = less_than(a, b);
}

main 函式的最後一行示範如何呼叫函式物件。 此呼叫看起來像對函式的呼叫,但它實際上是呼叫 operator() 型別 LessThanFunctor 。 呼叫函式物件與函式之間的這點相似性,導致產生了函式物件一詞。

函式物件和容器

C++標準連結庫包含頭檔中的數個函式物件 <functional> 。 這些函式物件的一個用途是做為容器的排序準則。 例如, set 容器的宣告方式如下:

template <class Key,
    class Compare = std::less<Key>,
    class Allocator = std::allocator<Key>>
class set;

第二個樣板引數是函式物件 less。 如果第一個參數小於第二個參數,則此函式物件會傳 true 回 。 由於某些容器會排序其元素,因此容器需要比較兩個元素的方式。 比較是使用函式物件來完成。 您可以建立一個函式物件,並在容器的樣板清單中指定這個物件,來為容器定義自己的排序準則。

函式物件和演算法

函式物件的另一種用法是在演算法中。 例如, remove_if 演算法的宣告方式如下:

template <class ForwardIterator, class UnaryPredicate>
ForwardIterator remove_if(
    ForwardIterator first,
    ForwardIterator last,
    UnaryPredicate pred);

傳遞給 remove_if 的最後一個引數是傳回布林值 ( 「述詞」(Predicate)) 的函式物件。 如果函式對象的結果為 true,則 元素會移位,使其超出 所 remove_if傳回的新結尾。 您可以使用 自變數<functional>標頭中pred宣告的任何函式物件,也可以建立自己的物件。

另請參閱

C++ 標準程式庫參考