定義
重載函式調用操作符的類,其對象常稱為函式對象(function object),即它們是行為類似函式的對象。又稱仿函式。
簡介
函式對象(function object)是一個程式設計的對象允許被當作普通函式來調用。
函式對象與函式指針相比,有兩個優點:第一是編譯器可以內聯執行函式對象的調用;第二是函式對象內部可以保持狀態。
函式式程式設計語言還支持閉包,例如,first-class函式支持在其創建時用到的函式外定義的變數的值保持下來,成為一個函式閉包。
C++ STL中的函式對象
C++的STL中的眾多algorithm,非常依賴於函式對象處理容器的元素。因此,STL預定義了許多函式對象、謂詞(predicate)、以及用於複合(composite)函式對象的binder、member function adapter、 pointer to function adapters、 negaters、 function objects base structure。由於STL中的algorithm使用函式對象作為參數時,一般都是傳值調用,所以函式對象應該仔細設計其複製構造函式。
預定義的函式對象
C++98在頭檔案functional中定義了下述函式對象: plus<type>() 結果為(param1 + param2) minus<type>() 結果為(param1 - param2) multiplies<type>() 結果為(param1 * param2) divides<type>() 結果為(param1 / param2) modulus<type>() 結果為(param1% param2)
謂詞(predicate)
返回布爾值(或者可以隱式轉換為布爾值)的函式對象。用於STL中的algorithm時,謂詞應該是無狀態的( stateless)函式對象,即謂詞的結果不依賴於內部的數據成員。這是因為STL中的algorithm不保證內部實現時對傳入的謂詞要複製多少次。 C++98在頭檔案functional中定義了下述謂詞:
•equal_to() 結果為(param1 == param2)
•not_equal_to() 結果為(param1!= param2)
•less() 結果為 (param1 < param2)
•greater() 結果為(param1 > param2)
•less_equal() 結果為 (param1 <= param2)
•greater_equal() 結果為 (param1 >= param2)
•logical_not() 結果為 (!param1)
•logical_and() 結果為 (param1 && param2)
•logical_or() 結果為 (param1 || param2)
Function Adapter
用於組合(combine)、變換(transform)、操作(manipulate)函式對象、特定參數值、或者特定函式。進一步細分為:
Binder
C++98在頭檔案functional中定義了兩個函式bind1st與bind2nd,返回值為binder1st、binder2nd類型。用於把二元函式對象分別綁定第一個、第二個參數後成為單元函式對象。
Negater
negate把一個作為謂詞的函式對象取反。C++98在頭檔案functional中定義了兩個函式not1與not2,返回值為unary_negate、binary_negate類型。
Member function adapter
Member function adapter用於把類的成員函式用作STL中的algorithm的參數。C++98在頭檔案functional中定義了:
•函式mem_fun,返回值為mem_fun_t類型,用於通過一個類對象指針來調用成員函式指針。
•函式mem_fun_ref,返回值為mem_fun_ref_t類型,用於通過一個類對象引用來調用成員函式指針。
Pointer to function adapter
函式指針適配器(Pointer to function adapter)是把函式指針包裝為一個函式對象,以便STL中的algorithm用函式對象作為統一的參數類型,不用再考慮以函式指針作為傳入參數的情形。C++98在頭檔案functional中定義了:
•函式ptr_fun,返回值為pointer_to_unary_function類型,包裝了一個單參數的函式指針。
•重載函式ptr_fun,返回值為pointer_to_binary_function類型,包裝了一個雙參數的函式指針。
Function Object Base
函式對象基類(Function Object Base)定義在頭檔案functional中,用作STL的預定義的與函式對象有關的各個類的基類,其中定義了幾個類型,分別表示函式調用的各個參數類型、結果類型。
•unary_function類,定義了2個類型:argument_type、result_type;
•binary_function類,定義了3個類型:first_argument_type、second_argument_type、result_type;