C++/Functional
Template:C++ Standard library <functional> 是C++標準程式庫中的一個標頭檔,定義了C++標準中的多個用於表示函式物件(function object)的類別模板(class template),包括算術操作、比較操作、邏輯操作;以及用於繫結函式物件的實參值的繫結器(binder)。這些類別模板的實例是具有函式呼叫運算子(function call operator)的C++的類別,這些類別的實例可以如同函式一樣呼叫。[1]不必寫新的函式物件,而僅是組合預定義的函式物件與函式物件配接器(function object adaptor),就可以執行非常複雜的操作。
C++11標準提供了類別模板std::function
是一個通用的、多型的函式包裝器(function wrapper)。std::function
的實例可以儲存、複製、呼叫任何可呼叫目標—如函式、lambda表達式、bind表達式(函式配接器物件實例,通過設定參數值把函式變換到參數更少的其他函式)、其他函式物件。
相關概念
[編輯]函式物件,是可以具有如同普通函式一樣的函式呼叫語法的資料物件。包括函式指標、類別成員函式指標、或者內部定義了函式呼叫運算子的類物件等。
C++的TR1標準引入了'呼叫特徵'(call signature):函式返回類型,之後是用括號包起來的用逗號分隔的形參類型列表(可以為0個形參)。呼叫特徵廣泛用於STL的模板定義。 呼叫特徵定義了一個函式的類型,但與傳統的函式指標類型的定義不同,呼叫特徵不需要表示「指標」型的星號*
。
可呼叫類型(callable type),包括函式指標、類別成員函式指標、 類資料成員指標(因為類的資料成員可能是個可呼叫類型)、或者內部定義了函式呼叫運算子的類類型。
C++標準庫提供的C++演算法,並不需要超過兩個參數的函式物件。返回布林型的函式是非常重要的特例,一元函式且返回值為布林型,稱為謂詞。二元函數返回布林型,稱為二元謂詞(binary predicate)。
可適配的函式物件
[編輯]C++標準規定,可適配的函式物件(adaptable function object)必須用typedef來指出其參數類型與返回值類型。對於無參函式物件F0,必須定義類型F0::result_type。對於一元函式物件F1,必須定義類型F1::argument_type與F1::result_type。對於二元函數物件F2,必須定義F2::first_argument_type、F2::second_argument_type、F2::result_type。C++標準庫提供了作為基本類型unary_function與binary_function來簡化可適配的無參函式與一元函式。可以從這兩個類衍生自己的類。
類別模板
[編輯]- bad_function_call 這是一個被丟擲的異常類,用於表示被呼叫的函式物件為空。例如,定義了一個std::function物件,但尚未用函式指標或函式物件來初始化,就呼叫了這個std::function物件,這時丟擲該異常類。
- binary_negate 這是一個類別模板用於包裝函式物件。初始化時在內部儲存了一個二元函數物件。呼叫時把指定的二元函數物件的返回值取反。
- binder1st 類別模板用於包裝函式物件。初始化時在內部儲存了一個二元函數物件,並把該二元函數的第一個參數繫結為一個固定的值,當作一元函式來呼叫。
- binder2nd 類別模板用於包裝函式物件。初始化時在內部儲存了一個二元函數物件,並把該二元函數的第二個參數繫結為一個固定的值,當作一元函式來呼叫。
- const_mem_fun_ref_t 類別模板作為配接器,初始化時在內部儲存一個無參的const型類別成員函式指標。呼叫時當作一元函式(傳入的參數實際上是類別成員函式所需的該類別實例的參照)。
- const_mem_fun_t 類別模板作為配接器,初始化時在內部儲存一個無參的const型類別成員函式指標。呼叫時當作一元函式(傳入的參數實際上是類別成員函式所需的該類別實例的指標)。
- const_mem_fun1_ref_t 類別模板作為配接器,初始化時在內部儲存一個單參的const型類別成員函式指標。呼叫時當作二元函數(傳入的第一個參數實際上是類別成員函式所需的該類別實例的參照)。
- const_mem_fun1_t 類別模板作為配接器,初始化時在內部儲存一個單參的const型類別成員函式指標。呼叫時當作二元函數(傳入的第一個參數實際上是類別成員函式所需的該類別實例的指標)。
- function 類別模板,用於包裝一個可呼叫(callable)的類。可以看做是C++98標準庫中函式物件mem_fun_t, pointer_to_unary_function等的替代品。function的模板參數是包裝的函式物件的call signature。可以直接包裝類別成員函式(在呼叫時必須把類別實例作為第一個參數)
- hash 模板類,其內部的函式成員運算子函式輸入為一個純量或字串,輸出為計算出來的hash值。用於STL的unordered_map, unordered_multimap, unordered_set, and unordered_multiset等模板類。
- is_bind_expression 類別模板,用於判斷指定表達式是否為std::bind函式返回的結果類型。
- is_placeholder 類別模板,用於判斷指定表達式是否為std::placeholders中定義的placeholder類型.
- mem_fun_ref_t 類別模板作為配接器,初始化時在內部儲存一個無參的non_const型類別成員函式指標。呼叫時當作一元函式(傳入的參數實際上是類別成員函式所需的該類別實例的參照)。
- mem_fun_t 類別模板作為配接器,初始化時在內部儲存一個無參的non_const型類別成員函式指標。呼叫時當作一元函式(傳入的參數實際上是類別成員函式所需的該類別實例的指標)。
- mem_fun1_ref_t 類別模板作為配接器,初始化時在內部儲存一個單參的non_const型類別成員函式指標。呼叫時當作二元函數(傳入的第一個參數實際上是類別成員函式所需的該類別實例的參照)。
- mem_fun1_t 類別模板作為配接器,初始化時在內部儲存一個單參的non_const型類別成員函式指標。呼叫時當作二元函數(傳入的第一個參數實際上是類別成員函式所需的該類別實例的指標)。
- pointer_to_binary_function 類別模板,用於把一個雙參的函式物件轉變為可適配的二元函數物件。即在內部定義 first_argument_type, second_argument_type, result_type三個類型。這樣才能進一步繫結參數等操作。
- pointer_to_unary_function 類別模板,用於把一個單參的函式物件轉變為可適配的一元函式物件。即在內部定義 argument_type, result_type兩個類型。這樣才能進一步繫結參數等操作。
- reference_wrapper 類別模板,用於包裝對一個實例的參照。如果被包裝的類型是一元函式物件或者二元函數物件,則會特化處理。
- result_of 類別模板,用於取出一個可呼叫函式物件的結果類型
- unary_negate 類別模板,用於把指定的單參謂詞的結果取反。
函式
[編輯]- bind 把一個多參數函式物件轉化為可適配的函式物件,繫結任意的參數為確定的值,重新安排參數對應順序。
- bind1st C++98用於繫結二元函數的第一個參數為確定的值
- bind2nd C++98用於繫結二元函數的第二個參數為確定的值
- bit_and 返回一個bit_and結構,作為函式物件
- bit_or 返回一個bit_or結構,作為函式物件
- bit_xor 返回一個bit_xor結構,作為函式物件
- cref 把一個實例物件包裝為reference_wrapper模板類
- mem_fn 返回一個類別成員函式的包裝可呼叫類。呼叫時顯式傳遞一個類物件實例作為第一個參數。
- mem_fun 返回一個類別成員函式的包裝類物件mem_fun_t、mem_fun1_t等。用類物件的指標去呼叫包裝類物件。
- mem_fun_ref 返回一個類別成員函式的包裝類物件mem_fun_ref_t、mem_fun1_ref_t等。用類物件的參照去呼叫包裝類物件。
- not1 返回一個對謂詞的結果取反的函式物件包裝類
- not2 返回一個對二元謂詞的結果取反的函式物件包裝類
- ptr_fun 對函式物件,做可適配改造,返回pointer_to_binary_function或者pointer_to_unary_function類物件
- ref 對一個實例物件,返回一個reference_wrapper包裝類。以此作為函式物件的參數繫結,還可以修改原實例的值來改變繫結的參數值。
- swap 交換兩個
function
的值。
結構
[編輯]C++標準標頭檔functional
中預定義了多個函式物件,包括算術運算的plus、minus、multiplies、divides、modulus、negate;比較運算equal_to、not_equal_to、greater、less、greater_equal、less_equal;邏輯運算logical_and、logical_or、logical_not。[1]
- binary_function 一個空基礎類別,用於衍生其他的二元函數物件的結構
- divides 做算術除法的函式物件的結構
- equal_to 做相等比較的二元謂詞的函式物件的結構
- greater 做大於比較的的二元謂詞的函式物件的結構
- greater_equal 做大於比較等於的的二元謂詞的函式物件的結構
- less 做小於比較的的二元謂詞的函式物件的結構
- less_equal 做小於比較等於的的二元謂詞的函式物件的結構
- logical_and 做邏輯與的的二元謂詞的函式物件的結構
- logical_not 做邏輯非的的謂詞的函式物件的結構
- logical_or 做邏輯或的的二元謂詞的函式物件的結構
- minus 做算術減法的函式物件的結構
- modulus 做算術模運算的函式物件的結構
- multiplies 做算術乘法的函式物件的結構
- negate 做算術相反數運算的函式物件的結構
- not_equal_to 做不等比較的二元謂詞的函式物件的結構
- plus 做算術加法的函式物件的結構
- unary_function 一個空基礎類別,用於衍生其他的一元函式物件的結構
物件
[編輯]- _1 到 _M 用於指示bind函式的形參對應於被包裝函式的那個實參。
運算子
[編輯]- operator== 比較函式物件是否為空指標
- operator!= 比較函式物件是否不為空指標
參考文獻
[編輯]頁面Template:ReflistH/styles.css沒有內容。
- ↑ 1.0 1.1 Josuttis, Nicolai M. The C++ Standard Library. Addison-Wesley. 1999. ISBN 0-201-37926-0.