命名空間
變體
動作

函式物件

出自 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++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* 止已棄用)
 

函式物件 (function object)」是指定義了函式呼叫運算子的任何物件。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 起) 的規則,用給定引數呼叫任何可呼叫 (Callable) 物件。

(C++17 起)(C++23 起)
呼叫任何可呼叫 (Callable) 物件,並傳入給定引數,且可指定回傳型別(自 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::placeholders
std::bind 運算式中未繫結引數的佔位符
(常數) [編輯]

[編輯] 反轉器

std::not_fn 建立一個函式物件,該物件會反轉傳入其可呼叫物件的結果。

(C++17)
建立一個函式物件,它回傳其所持有的函式物件結果的補數
(函式樣板) [編輯]

[編輯] 搜尋器

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

標準 C++ 函式庫搜尋演算法實作
(類別樣板) [編輯]
Boyer-Moore 搜尋演算法實作
(類別樣板) [編輯]
Boyer-Moore-Horspool 搜尋演算法實作
(類別樣板) [編輯]

[編輯] 參考包裝器

參考包裝器允許將參考引數儲存於可複製的函式物件中

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

透明函式物件

關聯式容器 (Associative containers)無序關聯式容器 (unordered associative containers)(自 C++20 起) 提供異質查詢及擦除(自 C++23 起) 操作,但只有在提供的函式物件型別 T透明 (transparent) 時才啟用:限定識別符 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 起)


輔助項目

以下僅供闡述的項目用於標準函式庫中的多個元件,但它們不是標準函式庫介面的一部分。

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++ 標準。

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 Rvoid,則 INVOKE<R> 未捨棄回傳值 在此情況下捨棄回傳值
LWG 2926
(P0604R0)
C++11 具有回傳型別 RINVOKE 操作的語法曾為
INVOKE(f, t1, t2, ..., tN, R)
已變更為
INVOKE<R>(f, t1, t2, ..., tN)
LWG 3655 C++11 INVOKE 未能正確處理聯集 (unions)
由於 LWG issue 2219 的決議
已正確處理
English Deutsch 日本語 中文(简体) 中文(繁體)