Namespaces
Variants

Function objects

From cppreference.net
Utilities library
Function objects
Function invocation
(C++17) (C++23)
Identity function object
(C++20)
Old binders and adaptors
( until C++17* )
( until C++17* )
( until C++17* )
( until C++17* )
( until C++17* ) ( until C++17* ) ( until C++17* ) ( until C++17* )
( until C++20* )
( until C++20* )
( until C++17* ) ( until C++17* )
( until C++17* ) ( until C++17* )

( until C++17* )
( until C++17* ) ( until C++17* ) ( until C++17* ) ( until C++17* )
( until C++20* )
( until C++20* )

一个 函数对象 是任何定义了函数调用运算符的对象。C++ 提供了许多内置函数对象,同时支持创建和操作新的函数对象。

目录

函数调用

仅用于阐述的操作 INVOKE ( f, arg_0, arg_1, arg_2, ..., arg_N ) 定义如下:

令类型 Obj arg_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 == 0 f 是类 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

令类型 Actual decltype ( 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::invoke std::invoke_r (C++23 起) 能够根据 INVOKE INVOKE<R> (C++23 起) 的规则,使用给定参数调用任何 Callable 对象。

(C++17) (C++23)
以给定参数调用任意 Callable 对象 并可指定返回类型 (C++23 起)
(函数模板)

函数包装器

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

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

标识

std::identity 是恒等函数对象:它返回未经改变的参数。

(C++20)
返回其参数不变的功能对象
(类)

部分函数应用

std::bind_front std::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 中包装的引用类型
(类模板)

透明函数对象

关联容器 无序关联容器 (C++20 起) 提供异构查找 与擦除操作 (C++23 起) ,但这些操作仅在提供的函数对象类型 T 透明 时启用:限定标识符 T::is_transparent 必须有效并代表一个类型。

标准库中所有透明函数对象类型都定义了嵌套类型 is_transparent 。然而,用户定义的透明函数对象类型无需直接提供 is_transparent 作为嵌套类型:只要 T::is_transparent 满足上述透明要求,该类型可以在基类中定义。

(C++14 起)

运算符函数对象

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

void 特化版本会根据其参数推导参数类型和返回类型,它们都是 透明 的。

(since 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 <= y 的受约束函数对象
(类)
实现 x >= y 的受约束函数对象
(类)
实现 x <=> y 的受约束函数对象
(类)
(since 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) ( 仅用于说明* )
(since 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++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 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 由于 LWG 2219 的解决方案,
INVOKE 未能正确处理联合体
已正确处理