函数对象
函数对象是定义了函数调用操作符的任何对象。C++ 提供了许多内置函数对象,并支持创建和操作新的函数对象。
目录 |
[编辑] 函数调用
仅用于解释的操作 令类型
|
(C++11 起) |
std::invoke
和 std::invoke_r
(C++23 起) 可以根据 INVOKE
和 INVOKE<R>
(C++23 起) 的规则,用给定参数调用任何可调用对象。
(C++17)(C++23) |
用给定参数调用任何可调用对象,并可能指定返回类型(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` 表达式或可用作 `std::bind` 表达式 (类模板) |
(C++11) |
指示一个对象是标准占位符或可用作标准占位符 (类模板) |
定义于命名空间
std::placeholders | |
(C++11) |
std::bind 表达式中未绑定参数的占位符(常量) |
[编辑] 否定器
std::not_fn 创建一个函数对象,它否定传递给它的可调用对象的结果。
(C++17) |
创建函数对象,该对象返回其所持函数对象结果的补数 (函数模板) |
[编辑] 搜索器
提供了实现多种字符串搜索算法的搜索器,它们可以直接使用或与 std::search 一起使用。
(C++17) |
标准 C++ 库搜索算法实现 (类模板) |
(C++17) |
Boyer-Moore 搜索算法实现 (类模板) |
Boyer-Moore-Horspool 搜索算法实现 (类模板) |
[编辑] 引用包装器
引用包装器允许将引用参数存储在可复制的函数对象中
(C++11) |
可复制构造和可复制赋值引用包装器 (类模板) |
(C++11)(C++11) |
创建一个类型从其参数推导的 std::reference_wrapper (函数模板) |
(C++20)(C++20) |
获取包装在 std::reference_wrapper 中的引用类型 (类模板) |
透明函数对象关联容器和无序关联容器(C++20 起) 提供异构查找和擦除(C++23 起)操作,但它们仅在提供的函数对象类型 标准库中所有透明函数对象类型都定义了一个嵌套类型 |
(C++14 起) |
[编辑] 运算符函数对象
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 起) |
辅助项 (Helper items)以下仅用于解释的项用于标准库中的多个组件,但它们不是标准库接口的一部分。
|
(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 | INVOKE 没有正确处理联合体由于 LWG issue 2219 的决议 |
正确处理 |