Function objects
A function object 是任何定义了函数调用运算符的对象。C++ 提供了许多内置函数对象,同时支持创建和操作新的函数对象。
目录 |
函数调用
|
仅用于阐述的操作
令类型
|
(自 C++11 起) |
std::invoke
和
std::invoke_r
(C++23 起)
能够根据
INVOKE
和
INVOKE<R>
(C++23 起)
的规则,使用给定参数调用任何
Callable
对象。
|
(C++17)
(C++23)
|
以给定参数调用任意
Callable
对象
,并可指定返回类型
(C++23 起)
(函数模板) |
函数包装器
这些多态包装类提供了对存储任意函数对象的支持。
|
(C++11)
|
任何可复制构造可调用对象的可复制包装器
(类模板) |
|
(C++23)
|
支持给定调用签名中限定符的任何可调用对象的仅移动包装器
(类模板) |
|
(C++26)
|
支持给定调用签名中限定符的任何可复制构造可调用对象的可复制包装器
(类模板) |
|
(C++26)
|
任何可调用对象的非拥有包装器
(类模板) |
|
(C++11)
|
调用空
std::function
时抛出的异常
(类) |
|
(C++11)
|
从成员指针创建函数对象
(函数模板) |
标识
std::identity 是恒等函数对象:它原封不动地返回其参数。
|
(C++20)
|
返回其参数不变值的函数对象
(类) |
部分函数应用
std::bind_front 和 std::bind 提供了对 部分函数应用 的支持,即将参数绑定到函数以生成新函数。
|
(C++20)
(C++23)
|
按顺序绑定可变数量的参数到函数对象
(函数模板) |
|
(C++11)
|
绑定一个或多个参数到函数对象
(函数模板) |
|
(C++11)
|
指示对象是
std::bind
表达式或可用作此类表达式
(类模板) |
|
(C++11)
|
指示对象是标准占位符或可用作占位符
(类模板) |
|
定义于命名空间
std::placeholders
|
|
|
(C++11)
|
std::bind
表达式中未绑定参数的占位符
(常量) |
取反器
std::not_fn 创建一个函数对象,该对象会对传递给它的可调用对象的结果进行逻辑取反。
|
(C++17)
|
创建返回其所持有函数对象结果之补集的函数对象
(函数模板) |
搜索器
提供了实现多种字符串搜索算法的搜索器,可直接使用或与 std::search 配合使用。
|
(C++17)
|
标准 C++ 库搜索算法实现
(类模板) |
|
(C++17)
|
Boyer-Moore 搜索算法实现
(类模板) |
|
(C++17)
|
Boyer-Moore-Horspool 搜索算法实现
(类模板) |
引用包装器
引用包装器允许将引用参数存储在可复制的函数对象中:
|
(C++11)
|
CopyConstructible
和
CopyAssignable
引用包装器
(类模板) |
|
(C++11)
(C++11)
|
创建类型从其参数推导的
std::reference_wrapper
(函数模板) |
|
(C++20)
(C++20)
|
获取包装在
std::reference_wrapper
中的引用类型
(类模板) |
透明函数对象
关联容器
与
无序关联容器
(C++20 起)
支持异构查找
与擦除操作
(C++23 起)
,但仅当提供的函数对象类型
标准库中的所有透明函数对象类型均定义了嵌套类型
|
(C++14 起) |
运算符函数对象
C++ 定义了以下表示常见算术和逻辑运算的函数对象。
|
void 特化版本会根据其参数推导参数类型和返回类型,它们都是 透明 的。 |
(since C++14) |
算术运算 |
|
|
实现
x
+
y
(类模板) |
|
|
(C++14)
|
实现
x
+
y
运算的函数对象,可推导参数和返回类型
(类模板特化) |
|
实现
x
-
y
(类模板) |
|
|
(C++14)
|
实现
x
-
y
运算的函数对象,可推导参数和返回类型
(类模板特化) |
|
实现
x
*
y
(类模板) |
|
|
(C++14)
|
实现
x
*
y
运算的函数对象,可推导参数和返回类型
(类模板特化) |
|
实现
x
/
y
运算的函数对象
(类模板) |
|
|
(C++14)
|
实现
x
/
y
运算的函数对象,可推导参数和返回类型
(类模板特化) |
|
实现
x
%
y
(类模板) |
|
|
(C++14)
|
实现
x
%
y
运算的函数对象,可推导参数和返回类型
(类模板特化) |
|
实现
-
x
(类模板) |
|
|
(C++14)
|
实现
-
x
的函数对象,可推导参数和返回类型
(类模板特化) |
比较操作 |
|
|
实现
x
==
y
(类模板) |
|
|
(C++14)
|
实现
x
==
y
的函数对象,可推导参数和返回类型
(类模板特化) |
|
实现
x
!
=
y
(类模板) |
|
|
(C++14)
|
实现
x
!
=
y
运算的函数对象
(类模板特化) |
|
实现
x
>
y
(类模板) |
|
|
(C++14)
|
实现
x
>
y
运算的函数对象,可推导参数和返回类型
(类模板特化) |
|
实现
x
<
y
(类模板) |
|
|
(C++14)
|
实现
x
<
y
运算的函数对象
(类模板特化) |
|
实现
x
>=
y
(类模板) |
|
|
(C++14)
|
实现
x
>=
y
的函数对象,可推导参数和返回类型
(类模板特化) |
|
实现
x
<=
y
(类模板) |
|
|
(C++14)
|
实现
x
<=
y
的函数对象,可推导参数和返回类型
(类模板特化) |
逻辑运算 |
|
|
实现
x
&&
y
(类模板) |
|
|
(C++14)
|
实现
x
&&
y
的函数对象,可推导参数和返回类型
(类模板特化) |
|
实现
x
||
y
的函数对象
(类模板) |
|
|
(C++14)
|
实现
x
||
y
运算的函数对象,可推导参数和返回类型
(类模板特化) |
|
实现逻辑非运算的函数对象
!
x
(类模板) |
|
|
(C++14)
|
实现
!
x
运算的函数对象,可推导参数和返回类型
(类模板特化) |
位运算 |
|
|
实现
x
&
y
(类模板) |
|
|
(C++14)
|
实现
x
&
y
运算的函数对象,可推导参数和返回类型
(类模板特化) |
|
实现
x
|
y
(类模板) |
|
|
(C++14)
|
实现
x
|
y
运算的函数对象,可推导参数和返回类型
(类模板特化) |
|
实现
x
^
y
(类模板) |
|
|
(C++14)
|
实现
x
^
y
运算的函数对象,可推导参数和返回类型
(类模板特化) |
|
(C++14)
|
实现
~x
运算的函数对象
(类模板) |
|
(C++14)
|
实现
~x
运算的函数对象,可推导参数和返回类型
(类模板特化) |
受约束的比较函数对象以下比较函数对象均为 受约束 的。
所有这些函数对象均为 透明 的。
|
(C++20 起) |
辅助项以下仅供说明使用的项被标准库中的多个组件使用,但它们不属于标准库的接口部分。
|
(自 C++26 起) |
旧式绑定器与适配器多个提供早期函数式支持的实用工具已被弃用并移除:
|
(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
的解决方案未能正确处理联合体
|
正确处理 |