函式物件（function object）是一個程式設計的物件允許被當作普通函式來呼叫。 函式物件與函式指標相比，有兩個優點：第一是編譯器可以內聯執行函式物件的呼叫；第二是函式物件內部可以保持狀態。 函式式程式設計語言還支援閉包，例如，firstclass 函式支援在其建立時用到的函式外定義的變數的值保持下來，成為一個函式閉包。 C 函式物件的例項 傳統的 CC 函式指標： include stdlibh Callback function returns 0 if a b 0 if a b 0 if a b int compareInts const void a const void b return const int a const int b prototype of qsort is void qsort void base size_t nel size_t width int comparconst void const void int main void int items 4 3 1 2 qsort items sizeof items sizeof items 0 sizeof items 0 compareInts return 0 C 中，函式物件是定義了函式呼叫運算子的類物件，稱作 class type functor。 comparator predicate returns true if a b false otherwise struct IntComparator bool operator const int a const int b const return a b An overload of stdsort is template class RandomIt class Compare void sort RandomIt first RandomIt last Compare comp int main stdvectorint items 4 3 1 2 stdsort itemsbegin itemsend IntComparator return 0 除了類型別函式物件，還有其他型別的函式物件，如使用成員函式指標或模板。C11 允許使用具有閉包功能的匿名函式。 C STL 中的函式物件 C 的 STL 中的眾多 algorithm，非常依賴於函式物件處理容器的元素。因此，STL 預定義了許多函式物件、謂詞（predicate）、以及用於複合（composite）函式物件的 binder、member function adapter、 pointer to function adapters、 negaters、 function objects base structure。由於 STL 中的 algorithm 使用函式物件作為引數時，一般都是傳值呼叫，所以函式物件應該仔細設計其複製建構函式。 預定義的函式物件 C98 在標頭檔案 functional 中定義了下述函式物件 plustype 結果為 param1 param2 minustype 結果為 param1 param2 multipliestype 結果為 param1 param2 dividestype 結果為 param1 param2 modulustype 結果為 param1 param2 謂詞（predicate） 返回布林值（或者可以隱式轉換為布林值）的函式物件。用於 STL 中的 algorithm 時，謂詞應該是無狀態的（ stateless）函式物件，即謂詞的結果不依賴於內部的資料成員。這是因為 STL 中的 algorithm 不保證內部實現時對傳入的謂詞要複製多少次。 C98 在標頭檔案 functional 中定義了下述謂詞 equal_totype 結果為 param1 param2 not_equal_totype 結果為 param1 param2 lesstype 結果為 param1 param2 greatertype 結果為 param1 param2 less_equaltype 結果為 param1 param2 greater_equaltype 結果為 param1 param2 logical_nottype 結果為 param1 logical_andtype 結果為 param1 param2 logical_ortype 結果為 param1 param2 Function Adapter 用於組合（combine）、變換（transform）、操作（manipulate）函式物件、特定引數值、或者特定函式。進一步細分為： Binder C98 在標頭檔案 functional 中定義了兩個函式 bind1st 與 bind2nd，返回值為 binder1st、binder2nd 型別。用於把二元函式物件分別繫結第一個、第二個引數後成為單元函式物件。 Negater negate 把一個作為謂詞的函式物件取反。C98 在標頭檔案 functional 中定義了兩個函式 not1 與 not2，返回值為 unary_negate、binary_negate 型別。 Member function adapter Member function adapter 用於把類的成員函式用作 STL 中的 algorithm 的引數。C98 在標頭檔案 functional 中定義了 函式 mem_fun，返回值為 mem_fun_t 型別，用於透過一個類物件指標來呼叫成員函式指標。 函式 mem_fun_ref，返回值為 mem_fun_ref_t 型別，用於透過一個類物件引用來呼叫成員函式指標。 Pointer to function adapter 函式指標介面卡（Pointer to function adapter）是把函式指標包裝為一個函式物件，以便 STL 中的 algorithm 用函式物件作為統一的引數型別，不用再考慮以函式指標作為傳入引數的情形。C98 在標頭檔案 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； Python Python 程式設計中，函式是作為頭等物件（firstclass object），可以如同普通的字串、數值、list 等物件那樣操作。這使得大部分編寫函式物件都是不必須的。 任何物件定義了__call__ 方法，就具有了可以當作函式呼叫的語法。例如下面的做累加的類 class Accumulator object def __init__self n selfn n def __call__self x selfn x return selfn 一個使用例子： a Accumulator 4 a 5 9 a 2 11 b Accumulator 42 b 7 49 因為函式就是物件，可當作區域性變數定義、確定其屬性（內部狀態）、作為別的函式的返回值。例如 def Accumulator n def inc x incn x return incn incn n return inc Python 3 中，可以用函式閉包來建立函式物件： def Accumulator n def inc x nonlocal n n x return n return inc 註釋 參考文獻 進一步閱讀 David Vandevoorde Nicolai M Josuttis 2006 C Templates The Complete Guide ISBN 0201734842 Specifically chapter 22 is devoted to function objects 外部連結 Function Objects STL by GabrielAndreas FleseriuMasur on February 22nd 2006 Description from the Portland Pattern Repository C Advanced Design Issues Asynchronous C by Kevlin Henney The Function Pointer Tutorials by Lars Haendel 20002001 Article Generalized Function Pointers by Herb Sutter Generic Algorithms for Java PHP Functors Function Objects in PHP What the heck is a functionoid and why would I use one C FAQ Category 面向物件的程式設計 Category 控制流程