名稱空間
變體
操作

函式物件

來自 cppreference.com
< cpp‎ | 工具
 
 
 
函式物件
函式呼叫
(C++17)(C++23)
恆等函式物件
(C++20)
透明運算子包裝器
(C++14)
(C++14)
(C++14)
(C++14)  
(C++14)
(C++14)
(C++14)
(C++14)
(C++14)
(C++14)
(C++14)
(C++14)
(C++14)

舊繫結器和介面卡
(直到 C++17*)
(直到 C++17*)
(直到 C++17*)
(直到 C++17*)  
(直到 C++17*)
(直到 C++17*)(直到 C++17*)(直到 C++17*)(直到 C++17*)
(直到 C++20*)
(直到 C++20*)
(直到 C++17*)(直到 C++17*)
(直到 C++17*)(直到 C++17*)

(直到 C++17*)
(直到 C++17*)(直到 C++17*)(直到 C++17*)(直到 C++17*)
(直到 C++20*)
(直到 C++20*)
 

函式物件是定義了函式呼叫運算子的任何物件。C++ 提供了許多內建函式物件,並支援建立和操作新的函式物件。

目錄

[編輯] 函式呼叫

僅用於解釋的操作 INVOKE(f, arg_0, arg_1, arg_2, ..., arg_N) 定義如下:

令型別 Objarg_0 的非限定型別(即 std::remove_cv<std::remove_reference<decltype(arg_0)>::type>::type

  • 如果 f 是類 C成員函式指標,則 INVOKE(f, obj, arg_1, arg_2, ..., arg_N) 等價於
  • (obj.*f)(arg_1, arg_2, ..., arg_N)(在物件上呼叫成員函式)。
  • (obj.get().*f)(arg_1, arg_2, ..., arg_N)(在特殊引用的物件上呼叫成員函式)。
  • 否則
  • ((*obj).*f)(arg_1, arg_2, ..., arg_N)(在解引用的物件上呼叫成員函式)。
  • 否則,如果 N == 0f 是類 C資料成員指標,則 INVOKE(mptr, obj) 等價於
  • obj.*mptr(訪問物件的資料成員)。
  • obj.get().*mptr(訪問特殊引用的物件的資料成員)。
  • 否則
  • (*obj).*mptr(訪問解引用的物件的資料成員)。
  • 否則
  • INVOKE(f, arg_0, arg_1, arg_2, ..., arg_N) 等價於 f(arg_0, arg_1, arg_2, ..., arg_N)(呼叫可呼叫物件)。


僅用於解釋的操作 INVOKE<R>(f, arg_0, arg_1, arg_2, ..., arg_N) 定義如下:

  • 如果 R 是(可能帶有 cv 限定符的)void
  • static_cast<void>(INVOKE(f, arg_0, arg_1, arg_2, ..., arg_N)).
  • 否則
  • INVOKE(f, arg_0, arg_1, arg_2, ..., arg_N) 隱式轉換為 R

令型別 Actualdecltype(INVOKE(f, arg_0, arg_1, arg_2, ..., arg_N))

  • INVOKE<R>(f, arg_0, arg_1, arg_2, ..., arg_N) 格式錯誤。
(C++23 起)
(C++11 起)


std::invokestd::invoke_r(C++23 起) 可以根據 INVOKEINVOKE<R>(C++23 起) 的規則,用給定引數呼叫任何可呼叫物件。

(C++17)(C++23)
用給定引數呼叫任何可呼叫物件,並可能指定返回型別(C++23 起)
(函式模板) [編輯]

[編輯] 函式包裝器

這些多型包裝器類提供儲存任意函式物件的支援。

(C++11)
任何可複製構造的可呼叫物件的包裝器
(類模板) [編輯]
任何支援給定呼叫簽名中限定符的可呼叫物件的僅移動包裝器
(類模板) [編輯]
任何可複製構造的可呼叫物件的包裝器,支援給定呼叫簽名中的限定符
(類模板) [編輯]
任何可呼叫物件的非擁有包裝器
(類模板) [編輯]
呼叫空的 std::function 時丟擲的異常
(類) [編輯]
(C++11)
從指向成員的指標建立函式物件
(函式模板) [編輯]

[編輯] 標識

std::identity 是標識函式物件:它返回其引數不變。

(C++20)
返回其引數不變的函式物件
(類) [編輯]

[編輯] 區域性函式應用

std::bind_frontstd::bind 提供對區域性函式應用的支援,即繫結引數到函式以生成新函式。

(C++20)(C++23)
按順序將可變數量的引數繫結到函式物件
(函式模板) [編輯]
(C++11)
將一個或多個引數繫結到函式物件
(函式模板) [編輯]
指示一個物件是 `std::bind` 表示式或可用作 `std::bind` 表示式
(類模板) [編輯]
指示一個物件是標準佔位符或可用作標準佔位符
(類模板) [編輯]
定義於名稱空間 std::placeholders
std::bind 表示式中未繫結引數的佔位符
(常量) [編輯]

[編輯] 否定器

std::not_fn 建立一個函式物件,它否定傳遞給它的可呼叫物件的結果。

(C++17)
建立函式物件,該物件返回其所持函式物件結果的補數
(函式模板) [編輯]

[編輯] 搜尋器

提供了實現多種字串搜尋演算法的搜尋器,它們可以直接使用或與 std::search 一起使用。

標準 C++ 庫搜尋演算法實現
(類模板) [編輯]
Boyer-Moore 搜尋演算法實現
(類模板) [編輯]
Boyer-Moore-Horspool 搜尋演算法實現
(類模板) [編輯]

[編輯] 引用包裝器

引用包裝器允許將引用引數儲存在可複製的函式物件中

可複製構造可複製賦值引用包裝器
(類模板) [編輯]
(C++11)(C++11)
建立一個型別從其引數推導的 std::reference_wrapper
(函式模板) [編輯]
獲取包裝在 std::reference_wrapper 中的引用型別
(類模板) [編輯]

透明函式物件

關聯容器無序關聯容器(C++20 起) 提供異構查詢和擦除(C++23 起)操作,但它們僅在提供的函式物件型別 T透明時才啟用:合格識別符號 T::is_transparent 是有效的並表示一個型別。

標準庫中所有透明函式物件型別都定義了一個巢狀型別 is_transparent。然而,使用者定義的透明函式物件型別不需要直接提供 is_transparent 作為巢狀型別:它可以在基類中定義,只要 T::is_transparent 滿足上述透明要求。

(C++14 起)

[編輯] 運算子函式物件

C++ 定義了以下表示常見算術和邏輯運算的函式物件。

void 特化從它們的引數推匯出它們的引數型別和返回型別,它們都是透明的

(C++14 起)
算術運算
實現 x + y 的函式物件
(類模板) [編輯]
實現 x + y 的函式物件,推導引數和返回型別
(類模板特化) [編輯]
實現 x - y 的函式物件
(類模板) [編輯]
實現 x - y 的函式物件,推導引數和返回型別
(類模板特化) [編輯]
實現 x * y 的函式物件
(類模板) [編輯]
實現 x * y 的函式物件,推導引數和返回型別
(類模板特化) [編輯]
實現 x / y 的函式物件
(類模板) [編輯]
實現 x / y 的函式物件,推導引數和返回型別
(類模板特化) [編輯]
實現 x % y 的函式物件
(類模板) [編輯]
實現 x % y 的函式物件,推導引數和返回型別
(類模板特化) [編輯]
實現 -x 的函式物件
(類模板) [編輯]
實現 -x 的函式物件,推導引數和返回型別
(類模板特化) [編輯]
比較
實現 x == y 的函式物件
(類模板) [編輯]
實現 x == y 的函式物件,推導引數和返回型別
(類模板特化) [編輯]
實現 x != y 的函式物件
(類模板) [編輯]
實現 x != y 的函式物件,推導引數和返回型別
(類模板特化) [編輯]
實現 x > y 的函式物件
(類模板) [編輯]
實現 x > y 的函式物件,推導引數和返回型別
(類模板特化) [編輯]
實現 x < y 的函式物件
(類模板) [編輯]
實現 x < y 的函式物件,推導引數和返回型別
(類模板特化) [編輯]
實現 x >= y 的函式物件
(類模板) [編輯]
實現 x >= y 的函式物件,推導引數和返回型別
(類模板特化) [編輯]
實現 x <= y 的函式物件
(類模板) [編輯]
實現 x <= y 的函式物件,推導引數和返回型別
(類模板特化) [編輯]
邏輯運算
實現 x && y 的函式物件
(類模板) [編輯]
實現 x && y 的函式物件,推導引數和返回型別
(類模板特化) [編輯]
實現 x || y 的函式物件
(類模板) [編輯]
實現 x || y 的函式物件,推導引數和返回型別
(類模板特化) [編輯]
實現 !x 的函式物件
(類模板) [編輯]
實現 !x 的函式物件,推導引數和返回型別
(類模板特化) [編輯]
位運算
實現 x & y 的函式物件
(類模板) [編輯]
實現 x & y 的函式物件,推導引數和返回型別
(類模板特化) [編輯]
實現 x | y 的函式物件
(類模板) [編輯]
實現 x | y 的函式物件,推導引數和返回型別
(類模板特化) [編輯]
實現 x ^ y 的函式物件
(類模板) [編輯]
實現 x ^ y 的函式物件,推導引數和返回型別
(類模板特化) [編輯]
(C++14)
實現 ~x 的函式物件
(類模板) [編輯]
實現 ~x 的函式物件,推導引數和返回型別
(類模板特化) [編輯]


受限比較函式物件

以下比較函式物件是受限的

  • 相等運算子(ranges::equal_toranges::not_equal_to)要求引數型別滿足equality_comparable_with
  • 關係運算符(ranges::lessranges::greaterranges::less_equalranges::greater_equal)要求引數型別滿足totally_ordered_with
  • 三路比較運算子(compare_three_way)要求型別建模three_way_comparable_with

所有這些函式物件都是透明的

實現 x == y 的受限函式物件
(類) [編輯]
實現 x != y 的受限函式物件
(類) [編輯]
實現 x < y 的受限函式物件
(類) [編輯]
實現 x > y 的受限函式物件
(類) [編輯]
實現 x <= y 的受限函式物件
(類) [編輯]
實現 x >= y 的受限函式物件
(類) [編輯]
實現 x <=> y 的受限函式物件
(類) [編輯]
(C++20 起)


輔助項 (Helper items)

以下僅用於解釋的項用於標準庫中的多個元件,但它們不是標準庫介面的一部分。

template< class Fn, class... Args >

concept /*callable*/ =
    requires (Fn&& fn, Args&&... args) {
        std::forward<Fn>(fn)(std::forward<Args>(args)...);

    };
(1) (僅作說明*)
template< class Fn, class... Args >

concept /*nothrow-callable*/ =
    /*callable*/<Fn, Args...> &&
    requires (Fn&& fn, Args&&... args) {
        { std::forward<Fn>(fn)(std::forward<Args>(args)...) } noexcept;

    };
(2) (僅作說明*)
template< class Fn, class... Args >
using /*call-result-t*/ = decltype(std::declval<Fn>()(std::declval<Args>()...));
(3) (僅作說明*)
template< const auto& T >
using /*decayed-typeof*/ = decltype(auto(T));
(4) (僅作說明*)
(C++26 起)


舊繫結器和介面卡

一些提供了早期函式支援的實用工具已被棄用和移除

基類
(C++11 中已廢棄)(C++17 中已移除)
與介面卡相容的一元函式基類
(類模板) [編輯]
(C++11 中已廢棄)(C++17 中已移除)
與介面卡相容的二元函式基類
(類模板) [編輯]
繫結器
(C++11 中已廢棄)(C++17 中已移除)
儲存二元函式及其一個引數的函式物件
(類模板) [編輯]
(C++11 中已廢棄)(C++17 中已移除)
將一個引數繫結到二元函式
(函式模板) [編輯]
函式介面卡
(C++11 中已廢棄)(C++17 中已移除)
指向一元函式的指標的介面卡相容包裝器
(類模板) [編輯]
(C++11 中已廢棄)(C++17 中已移除)
指向二元函式的指標的介面卡相容包裝器
(類模板) [編輯]
(C++11 中已廢棄)(C++17 中已移除)
從函式指標建立介面卡相容函式物件包裝器
(函式模板) [編輯]
(C++11 中已廢棄)(C++17 中已移除)
指向無參或一元成員函式的指標的包裝器,可使用物件指標呼叫
(類模板) [編輯]
(C++11 中已廢棄)(C++17 中已移除)
從成員函式指標建立包裝器,可使用物件指標呼叫
(函式模板) [編輯]
指向無參或一元成員函式的指標的包裝器,可使用物件引用呼叫
(類模板) [編輯]
(C++11 中已廢棄)(C++17 中已移除)
從成員函式指標建立包裝器,可使用物件引用呼叫
(函式模板) [編輯]
(C++17 中已棄用)(C++20 中已移除)
返回其所持一元謂詞補集的包裝函式物件
(類模板) [編輯]
(C++17 中已棄用)(C++20 中已移除)
返回其所持二元謂詞補集的包裝函式物件
(類模板) [編輯]
(C++17 中已棄用)(C++20 中已移除)
構造自定義的 std::unary_negate 物件
(函式模板) [編輯]
(C++17 中已棄用)(C++20 中已移除)
構造自定義的 std::binary_negate 物件
(函式模板) [編輯]
(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 如果 RvoidINVOKE<R> 沒有丟棄返回值 在此情況下丟棄返回值
LWG 2926
(P0604R0)
C++11 帶有返回型別 RINVOKE 操作的語法是
INVOKE(f, t1, t2, ..., tN, R)
更改為
INVOKE<R>(f, t1, t2, ..., tN)
LWG 3655 C++11 INVOKE 沒有正確處理聯合體
由於 LWG issue 2219 的決議
正確處理