函式物件
「函式物件 (function object)」是指定義了函式呼叫運算子的任何物件。C++ 提供了許多內建函式物件,也支援建立和操作新的函式物件。
目錄 |
[編輯] 函式呼叫
|
僅供闡述的操作 令型別
|
(C++11 起) |
std::invoke 及 std::invoke_r(自 C++23 起) 可根據 INVOKE 及 INVOKE<R>(自 C++23 起) 的規則,用給定引數呼叫任何可呼叫 (Callable) 物件。
| (C++17 起)(C++23 起) |
呼叫任何可呼叫 (Callable) 物件,並傳入給定引數,且可指定回傳型別(自 C++23 起) (函式樣板) |
[編輯] 函式包裝器
這些多型包裝器類別提供儲存任意函式物件的支援。
| (C++11) |
任何可複製建構的可呼叫物件的可複製包裝器 (類別模板) |
| (C++23) |
任何在給定呼叫簽章中支援限定符的可呼叫物件的僅移動包裝器 (類別模板) |
| (C++26) |
任何可複製建構的可呼叫物件的可複製包裝器,支援給定呼叫簽章中的限定符 (類別樣板) |
| (C++26) |
任何可呼叫物件的非擁有的包裝器 (類別樣板) |
| (C++11) |
呼叫空的 std::function 時拋出的例外 (類別) |
| (C++11) |
從成員指標建立函式物件 (函式樣板) |
[編輯] 恆等
std::identity 是恆等函式物件:它會不經修改地回傳其引數。
| (C++20) |
直接回傳其參數而不作修改的函式物件 (類別) |
[編輯] 函式部分應用
std::bind_front 和 std::bind 提供函式部分應用的支援,即將引數繫結至函式以產生新函式。
| (C++20 起)(C++23 起) |
依序將可變數量的引數繫結至函式物件 (函式樣板) |
| (C++11) |
將一個或多個引數繫結至函式物件 (函式樣板) |
| (C++11) |
指示物件是 std::bind 運算式或可用作其一(類別樣板) |
| (C++11) |
指示物件是標準佔位符或可用作其一 (類別樣板) |
| 定義於命名空間
std::placeholders | |
| (C++11) |
std::bind 運算式中未繫結引數的佔位符(常數) |
[編輯] 反轉器
std::not_fn 建立一個函式物件,該物件會反轉傳入其可呼叫物件的結果。
| (C++17) |
建立一個函式物件,它回傳其所持有的函式物件結果的補數 (函式樣板) |
[編輯] 搜尋器
提供了實現多種字串搜尋演算法的搜尋器,可直接使用或與 std::search 搭配使用。
| (C++17) |
標準 C++ 函式庫搜尋演算法實作 (類別樣板) |
| (C++17) |
Boyer-Moore 搜尋演算法實作 (類別樣板) |
| Boyer-Moore-Horspool 搜尋演算法實作 (類別樣板) |
[編輯] 參考包裝器
參考包裝器允許將參考引數儲存於可複製的函式物件中
| (C++11) |
可複製建構 (CopyConstructible) 且 可複製賦值 (CopyAssignable) 的參考包裝器 (類別樣板) |
| (C++11)(C++11) |
建立一個從其引數推導型別的 std::reference_wrapper (函式樣板) |
| (C++20)(C++20) |
獲取包裝在 std::reference_wrapper 中的參照型別 (類別模板) |
透明函式物件關聯式容器 (Associative containers) 及 無序關聯式容器 (unordered associative containers)(自 C++20 起) 提供異質查詢及擦除(自 C++23 起) 操作,但只有在提供的函式物件型別 標準函式庫中的所有透明函式物件型別都定義了一個巢狀型別 |
(C++14 起) |
[編輯] 運算子函式物件
C++ 定義了以下代表常見算術及邏輯運算的函式物件。
|
void 特化從其引數推導其參數型別和回傳型別,它們都是透明的。 |
(C++14 起) |
算術運算 | |
| 實作 x + y 的函式物件 (類別樣板) | |
| (C++14) |
實作 x + y 且推導參數及回傳型別的函式物件 (類別樣板特化) |
| 實作 x - y 的函式物件 (類別樣板) | |
| (C++14) |
實作 x - y 且推導參數及回傳型別的函式物件 (類別樣板特化) |
| 實作 x * y 的函式物件 (類別樣板) | |
| (C++14) |
實作 x * y 且推導參數及回傳型別的函式物件 (類別樣板特化) |
| 實作 x / y 的函式物件 (類別樣板) | |
| (C++14) |
實作 x / y 且推導參數及回傳型別的函式物件 (類別樣板特化) |
| 實作 x % y 的函式物件 (類別樣板) | |
| (C++14) |
實作 x % y 且推導參數及回傳型別的函式物件 (類別樣板特化) |
| 實作 -x 的函式物件 (類別樣板) | |
| (C++14) |
實作 -x 且推導參數及回傳型別的函式物件 (類別樣板特化) |
比較運算 | |
| 實作 x == y 的函式物件 (類別樣板) | |
| (C++14) |
實作 x == y 且推導參數及回傳型別的函式物件 (類別樣板特化) |
| 實作 x != y 的函式物件 (類別樣板) | |
| (C++14) |
實作 x != y 且推導參數及回傳型別的函式物件 (類別樣板特化) |
| 實作 x > y 的函式物件 (類別樣板) | |
| (C++14) |
實作 x > y 且推導參數及回傳型別的函式物件 (類別樣板特化) |
| 實作 x < y 的函式物件 (類別樣板) | |
| (C++14) |
實作 x < y 且推導參數及回傳型別的函式物件 (類別樣板特化) |
| 實作 x >= y 的函式物件 (類別樣板) | |
| (C++14) |
實作 x >= y 且推導參數及回傳型別的函式物件 (類別樣板特化) |
| 實作 x <= y 的函式物件 (類別樣板) | |
| (C++14) |
實作 x <= y 且推導參數及回傳型別的函式物件 (類別樣板特化) |
邏輯運算 | |
| 實作 x && y 的函式物件 (類別樣板) | |
| (C++14) |
實作 x && y 且推導參數及回傳型別的函式物件 (類別樣板特化) |
| 實作 x || y 的函式物件 (類別樣板) | |
| (C++14) |
實作 x || y 且推導參數及回傳型別的函式物件 (類別樣板特化) |
| 實作 !x 的函式物件 (類別樣板) | |
| (C++14) |
實作 !x 且推導參數及回傳型別的函式物件 (類別樣板特化) |
位元運算 | |
| 實作 x & y 的函式物件 (類別樣板) | |
| (C++14) |
實作 x & y 且推導參數及回傳型別的函式物件 (類別樣板特化) |
| 實作 x | y 的函式物件 (類別樣板) | |
| (C++14) |
實作 x | y 且推導參數及回傳型別的函式物件 (類別樣板特化) |
| 實作 x ^ y 的函式物件 (類別樣板) | |
| (C++14) |
實作 x ^ y 且推導參數及回傳型別的函式物件 (類別樣板特化) |
| (C++14) |
實作 ~x 的函式物件 (類別樣板) |
| (C++14) |
實作 ~x 且推導參數及回傳型別的函式物件 (類別樣板特化) |
受限比較函式物件以下比較函式物件是受限的。
所有這些函式物件都是透明的。
|
(自 C++20 起) |
輔助項目以下僅供闡述的項目用於標準函式庫中的多個元件,但它們不是標準函式庫介面的一部分。
|
(C++26 起) |
舊版繫結器與配接器某些提供早期函式支援的公用程式已被棄用並移除
|
(直到 C++20) | ||||||||||||||||||||||||||||||||||||
[編輯] 缺陷報告
下列更改行為的缺陷報告追溯應用於之前的 C++ 標準。
| DR | 應用於 | 出版時的行為 | 正確的行為 |
|---|---|---|---|
| LWG 185 | C++98 | 使用函式物件提高了程式效率 | 移除了該主張 |
| LWG 660 | C++98 | 缺少用於位元運算的函式物件 | 已新增 |
| LWG 2149 | C++98 | 函式物件被要求接收一個或兩個引數以 提供巢狀型別來表示引數和結果型別 |
不再需要 |
| LWG 2219 | C++11 | INVOKE 未能正確處理 std::reference_wrapper |
已正確處理 |
| LWG 2420 | C++11 | 若 R 為 void,則 INVOKE<R> 未捨棄回傳值 |
在此情況下捨棄回傳值 |
| LWG 2926 (P0604R0) |
C++11 | 具有回傳型別 R 的 INVOKE 操作的語法曾為INVOKE(f, t1, t2, ..., tN, R) |
已變更為INVOKE<R>(f, t1, t2, ..., tN)
|
| LWG 3655 | C++11 | INVOKE 未能正確處理聯集 (unions)由於 LWG issue 2219 的決議 |
已正確處理 |