函式物件
函式物件是定義了函式呼叫運算子的任何物件。C++ 提供了許多內建函式物件,並支援建立和操作新的函式物件。
目錄 |
[編輯] 函式呼叫
僅用於解釋的操作 令型別
|
(C++11 起) |
std::invoke
和 std::invoke_r
(C++23 起) 可以根據 INVOKE
和 INVOKE<R>
(C++23 起) 的規則,用給定引數呼叫任何可呼叫物件。
(C++17)(C++23) |
用給定引數呼叫任何可呼叫物件,並可能指定返回型別(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` 表示式或可用作 `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) |
可複製構造和可複製賦值引用包裝器 (類模板) |
(C++11)(C++11) |
建立一個型別從其引數推導的 std::reference_wrapper (函式模板) |
(C++20)(C++20) |
獲取包裝在 std::reference_wrapper 中的引用型別 (類模板) |
透明函式物件關聯容器和無序關聯容器(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 起) |
輔助項 (Helper items)以下僅用於解釋的項用於標準庫中的多個元件,但它們不是標準庫介面的一部分。
|
(C++26 起) |
舊繫結器和介面卡一些提供了早期函式支援的實用工具已被棄用和移除
|
(C++20 前) |
[編輯] 缺陷報告
下列更改行為的缺陷報告追溯地應用於以前出版的 C++ 標準。
缺陷報告 | 應用於 | 釋出時的行為 | 正確的行為 |
---|---|---|---|
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 沒有正確處理聯合體由於 LWG issue 2219 的決議 |
正確處理 |