函数对象
任何定义了函数调用操作符的对象都是函数对象。C++ 支持创建、操作新的函数对象,同时也提供了许多内置的函数对象。
函数调用
仅用于阐述的
仅用于阐述的
|
(C++11 起) |
std::invoke / std::invoke_r
(C++23
起) 可以按
INVOKE
/
INVOKE<R>
(C++23
起) 的规则以给定参数调用任何可调用 (Callable)
对象。
(C++17)(C++23)
|
以给定实参和可能指定的返回类型
(C++23
起)调用任意可调用
(Callable)
对象 (函数模板) |
函数包装器
std::function 提供存储任意类型函数对象的支持。
(C++11)
|
包装具有指定函数调用签名的任意可复制构造类型的可调用对象 (类模板) |
(C++23)
|
包装具有指定函数调用签名的任意类型的可调用对象 (类模板) |
(C++11)
|
调用空的 std::function
时抛出的异常 (类) |
(C++11)
|
从成员指针创建出函数对象 (函数模板) |
恒等
std::identity 是恒等函数对象:它返回其不修改的参数。
(C++20)
|
返回其未修改的参数的函数对象 (类) |
部分函数应用
std::bind_front 与 std::bind 提供部分函数应用的支持,即绑定参数到函数以创建新函数。
(C++20)
|
按顺序绑定一定数量的参数到函数对象 (函数模板) |
(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++ 针对常用的算术和逻辑运算定义了很多函数对象:
算术运算 |
|
实现 x +
y 的函数对象 (类模板) |
|
实现 x -
y 的函数对象 (类模板) |
|
实现 x *
y 的函数对象 (类模板) |
|
实现 x /
y 的函数对象 (类模板) |
|
实现 x %
y 的函数对象 (类模板) |
|
实现 -x
的函数对象 (类模板) |
|
比较 |
|
实现 x ==
y 的函数对象 (类模板) |
|
实现 x !=
y 的函数对象 (类模板) |
|
实现 x >
y 的函数对象 (类模板) |
|
实现 x <
y 的函数对象 (类模板) |
|
实现 x >=
y 的函数对象 (类模板) |
|
实现 x <=
y 的函数对象 (类模板) |
|
逻辑运算 |
|
实现 x &&
y 的函数对象 (类模板) |
|
实现 x ||
y 的函数对象 (类模板) |
|
实现 !x
的函数对象 (类模板) |
|
位运算 |
|
实现 x &
y 的函数对象 (类模板) |
|
实现 x |
y 的函数对象 (类模板) |
|
实现 x ^
y 的函数对象 (类模板) |
|
(C++14)
|
实现 ~x
的函数对象 (类模板) |
受约束的比较函数对象
C++20 定义了一组受约束的比较函数对象。相等运算符
(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
。
(C++20)
|
实现 x ==
y 的函数对象 (类) |
(C++20)
|
实现 x !=
y 的函数对象 (类) |
(C++20)
|
实现 x <
y 的函数对象 (类) |
(C++20)
|
实现 x >
y 的函数对象 (类) |
(C++20)
|
实现 x <=
y 的函数对象 (类) |
(C++20)
|
实现 x >=
y 的函数对象 (类) |
(C++20)
|
实现 x <=>
y 的函数对象 (类) |
旧式绑定器与适配器
早期提供功能支持的几个工具在 C++11 中弃用,并于 C++17 中移除(旧否定器于 C++17 中弃用并于 C++20 中移除):
基类 |
|
(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++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++ 标准。
缺陷报告 | 应用于 | 出版时的行为 | 正确行为 |
---|---|---|---|
LWG 185 | C++98 | 使用函数对象就会增加程序效率 | 移除该断言 |
LWG 660 | 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 | 由于 LWG
问题 2219 的解决方案,INVOKE
没有正确处理联合体
|
能正确处理 |