Function objects
一个 函数对象 是任何定义了函数调用运算符的对象。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
函数对象
(类模板特化) |
|
|
|
受约束比较函数对象以下比较函数对象均为 受约束 的。
所有这些函数对象都是 透明 的。
|
(since C++20) |
辅助项以下仅供说明的项被标准库中的多个组件使用,但它们不属于标准库接口的一部分。
|
(since 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 |
当
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
未能正确处理联合体
|
已正确处理 |