函数对象
函数对象是任何定义了函数调用运算符的对象。C++ 提供了许多内置函数对象,以及支持创建和操作新的函数对象。
内容 |
[编辑] 函数调用
仅用于说明的运算 令类型
|
(自 C++11 起) |
std::invoke
和 std::invoke_r
(自 C++23 起) 可以根据 INVOKE
和 INVOKE<R>
(自 C++23 起) 的规则,使用给定的参数调用任何 Callable 对象。
(C++17)(C++23) |
使用给定的参数调用任何 Callable 对象 并有可能指定返回类型(自 C++23 起) (函数模板) |
[edit] 函数包装器
这些多态包装器类提供了对存储任意函数对象的的支持。
(C++11) |
任何可复制构造的可调用对象的可复制包装器 (类模板) |
(C++23) |
任何支持给定调用签名中限定符的可调用对象的仅移动包装器 (类模板) |
(C++26) |
任何支持给定调用签名中限定符的可复制构造的可调用对象的可复制包装器 (类模板) |
(C++26) |
任何可调用对象的非拥有包装器 (类模板) |
(C++11) |
在调用空 std::function 时抛出的异常 (类) |
(C++11) |
从指向成员的指针创建函数对象 (函数模板) |
[edit] 恒等
std::identity 是恒等函数对象:它返回其参数不变。
(C++20) |
返回其参数不变的函数对象 (类) |
[edit] 部分函数应用
std::bind_front 和 std::bind 提供了对 部分函数应用 的支持,即,将参数绑定到函数以生成新函数。
(C++20)(C++23) |
按顺序将可变数量的参数绑定到函数对象 (函数模板) |
(C++11) |
将一个或多个参数绑定到函数对象 (函数模板) |
(C++11) |
表示对象是 std::bind 表达式或可以用作一个(类模板) |
(C++11) |
表示对象是标准占位符或可以用作一个 (类模板) |
在
std::placeholders 命名空间中定义 | |
(C++11) |
std::bind 表达式中未绑定参数的占位符(常量) |
[edit] 取反运算符
std::not_fn 创建一个函数对象,该对象取反传递给它的可调用对象的结果。
(C++17) |
创建一个函数对象,该对象返回其持有的函数对象的结果的补码 (函数模板) |
[edit] 搜索器
提供了实现几种字符串搜索算法的搜索器,可以单独使用,也可以与 std::search 一起使用。
(C++17) |
标准 C++ 库搜索算法实现 (类模板) |
(C++17) |
Boyer-Moore 搜索算法实现 (类模板) |
Boyer-Moore-Horspool 搜索算法实现 (类模板) |
[edit] 引用包装器
引用包装器允许将引用参数存储在可复制的函数对象中
(C++11) |
CopyConstructible 和 CopyAssignable 引用包装器 (类模板) |
(C++11)(C++11) |
创建一个 std::reference_wrapper,其类型从其参数推断而来 (函数模板) |
(C++20)(C++20) |
获取 std::reference_wrapper 中包装的引用类型 (类模板) |
透明函数对象关联容器 和 无序关联容器(自 C++20 起) 提供异构查找 和删除(自 C++23 起) 操作,但它们仅在提供的函数对象类型 标准库中的所有透明函数对象类型都定义了一个嵌套类型 |
(自 C++14 起) |
[edit] 运算符函数对象
C++ 定义了以下函数对象,这些函数对象表示常见的算术和逻辑运算。
void 特化推断其参数类型和返回类型,它们都是 透明的。 |
(自 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++ 标准。
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 | 如果 R 为 void,则 INVOKE<R> 不会丢弃返回值 |
在这种情况下会丢弃返回值 |
LWG 2926 (P0604R0) |
C++11 | 具有返回值类型的 INVOKE 操作的语法类型 R 为 INVOKE (f, t1, t2, ..., tN, R) |
更改为INVOKE<R> (f, t1, t2, ..., tN)
|
LWG 3655 | C++11 | INVOKE 未正确处理联合由于 LWG 问题 2219 的解决 |
正确处理 |