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.