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* )

A function object 是任何定义了函数调用运算符的对象。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
(类模板)
实现 ! x 运算的函数对象,可推导参数和返回类型
(类模板特化)
位运算
实现 x & y
(类模板)
实现 x & y 运算的函数对象,可推导参数和返回类型
(类模板特化)
实现 x | y
(类模板)
实现 x | y 运算的函数对象,可推导参数和返回类型
(类模板特化)
实现 x ^ y
(类模板)
实现 x ^ y 运算的函数对象,可推导参数和返回类型
(类模板特化)
(C++14)
实现 ~x 运算的函数对象
(类模板)
实现 ~x 运算的函数对象,可推导参数和返回类型
(类模板特化)


受约束的比较函数对象

以下比较函数对象均为 受约束 的。

  • 相等性运算符( ranges::equal_to ranges::not_equal_to )要求参数类型满足 equality_comparable_with 概念。
  • 关系运算符( ranges::less ranges::greater ranges::less_equal ranges::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++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 INVOKE<R> R void 时未丢弃返回值 此情况下丢弃返回值
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 2219 的解决方案未能正确处理联合体 正确处理