命名空间
变体
操作

函数对象

来自 cppreference.com
< cpp‎ | utility
 
 
实用程序库
语言支持
类型支持 (基本类型,RTTI)
库功能测试宏 (C++20)
动态内存管理
程序实用程序
协程支持 (C++20)
可变参数函数
调试支持
(C++26)
三元比较
(C++20)
(C++20)(C++20)(C++20)
(C++20)(C++20)(C++20)
通用实用程序
日期和时间
函数对象
格式化库 (C++20)
(C++11)
关系运算符 (C++20 中已弃用)
整数比较函数
(C++20)(C++20)(C++20)   
(C++20)
交换类型操作
(C++14)
(C++11)
(C++11)
(C++11)
(C++17)
通用词汇类型
(C++11)
(C++17)
(C++17)
(C++17)
(C++11)
(C++17)
(C++23)
基本字符串转换
(C++17)
(C++17)

 
函数对象
函数调用
(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 之前已弃用*)
 

函数对象是任何定义了函数调用运算符的对象。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) 为 ill-formed。
(自 C++23 起)
(自 C++11 起)


std::invokestd::invoke_r(自 C++23 起) 可以根据 INVOKEINVOKE<R>(自 C++23 起) 的规则,使用给定的参数调用任何 Callable 对象。

(C++17)(C++23)
使用给定的参数调用任何 Callable 对象 并有可能指定返回类型(自 C++23 起)
(函数模板) [edit]

[edit] 函数包装器

这些多态包装器类提供了对存储任意函数对象的的支持。

(C++11)
任何可复制构造的可调用对象的可复制包装器
(类模板) [edit]
任何支持给定调用签名中限定符的可调用对象的仅移动包装器
(类模板) [edit]
任何支持给定调用签名中限定符的可复制构造的可调用对象的可复制包装器
(类模板) [edit]
任何可调用对象的非拥有包装器
(类模板) [edit]
在调用空 std::function 时抛出的异常
(类) [edit]
(C++11)
从指向成员的指针创建函数对象
(函数模板) [edit]

[edit] 恒等

std::identity 是恒等函数对象:它返回其参数不变。

(C++20)
返回其参数不变的函数对象
(类) [edit]

[edit] 部分函数应用

std::bind_frontstd::bind 提供了对 部分函数应用 的支持,即,将参数绑定到函数以生成新函数。

(C++20)(C++23)
按顺序将可变数量的参数绑定到函数对象
(函数模板) [edit]
(C++11)
将一个或多个参数绑定到函数对象
(函数模板) [edit]
表示对象是 std::bind 表达式或可以用作一个
(类模板) [edit]
表示对象是标准占位符或可以用作一个
(类模板) [edit]
std::placeholders 命名空间中定义
std::bind 表达式中未绑定参数的占位符
(常量) [edit]

[edit] 取反运算符

std::not_fn 创建一个函数对象,该对象取反传递给它的可调用对象的结果。

(C++17)
创建一个函数对象,该对象返回其持有的函数对象的结果的补码
(函数模板) [edit]

[edit] 搜索器

提供了实现几种字符串搜索算法的搜索器,可以单独使用,也可以与 std::search 一起使用。

标准 C++ 库搜索算法实现
(类模板) [edit]
Boyer-Moore 搜索算法实现
(类模板) [edit]
Boyer-Moore-Horspool 搜索算法实现
(类模板) [edit]

[edit] 引用包装器

引用包装器允许将引用参数存储在可复制的函数对象中

CopyConstructibleCopyAssignable 引用包装器
(类模板) [edit]
(C++11)(C++11)
创建一个 std::reference_wrapper,其类型从其参数推断而来
(函数模板) [edit]
获取 std::reference_wrapper 中包装的引用类型
(类模板) [edit]

透明函数对象

关联容器无序关联容器(自 C++20 起) 提供异构查找 和删除(自 C++23 起) 操作,但它们仅在提供的函数对象类型 T透明 的情况下启用:限定标识符 T::is_transparent 有效,并表示一个类型。

标准库中的所有透明函数对象类型都定义了一个嵌套类型 is_transparent。但是,用户定义的透明函数对象类型不需要直接提供 is_transparent 作为嵌套类型:它可以定义在基类中,只要 T::is_transparent 满足上面提到的透明要求。

(自 C++14 起)

[edit] 运算符函数对象

C++ 定义了以下函数对象,这些函数对象表示常见的算术和逻辑运算。

void 特化推断其参数类型和返回类型,它们都是 透明的

(自 C++14 起)
算术运算
实现 x + y 的函数对象
(类模板) [edit]
实现 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 并推断参数和返回值类型的函数对象
(类模板特化) [编辑]


约束比较函数对象

以下比较函数对象是 受约束的

所有这些函数对象都是 透明的

实现 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 具有返回值类型的 INVOKE 操作的语法
类型 RINVOKE(f, t1, t2, ..., tN, R)
更改为
INVOKE<R>(f, t1, t2, ..., tN)
LWG 3655 C++11 INVOKE 未正确处理联合
由于 LWG 问题 2219 的解决
正确处理