C++/Functional

本頁使用了標題或全文手工轉換
維基教科書,自由的教學讀本
< C++

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. 1.0 1.1 Josuttis, Nicolai M. The C++ Standard Library. Addison-Wesley. 1999. ISBN 0-201-37926-0.