std::compare_3way
来自cppreference.com
| 定义于头文件 <algorithm>
|
||
| template< class T, class U > constexpr auto compare_3way( const T& a, const U& b ); |
(C++20 起) | |
用三路比较比较二个值,并产生最强的可应用比较类别类型。
详细而言:
- 若表达式 a <=> b 为良式,则返回其结果
- 否则,若表达式 a == b 与 a < b 均为良式且可转换为 bool ,则
- 若 a == b 等于 true ,则返回 std::strong_ordering::equal
- 否则,若 a < b 等于 true ,则返回 std::strong_ordering::less
- 否则,返回 std::strong_ordering::greater
- 否则,若表达式 a == b 为良式且可转换为 bool (但 a < b 非如此),则
- 若 a == b 等于 true ,则返回 std::strong_equality::equal
- 否则,返回 std::strong_equality::nonequal
- 否则(若 a <=> b 与 a == b 均非良式),则定义函数为被删除。
目录 |
[编辑] 参数
| a, b | - | 要比较的值 |
[编辑] 返回值
上述值。
[编辑] 注意
此函数在泛型编程中有用,因为它在 <=> 不可用时以 < 和 == 为后备。
[编辑] 示例
运行此代码
#include <iostream> #include <compare> #include <algorithm> // 不支持 <=> struct Rational_1 { int num; int den; // > 0 }; inline constexpr bool operator<(Rational_1 lhs, Rational_1 rhs) { return lhs.num * rhs.den < rhs.num * lhs.den; } inline constexpr bool operator==(Rational_1 lhs, Rational_1 rhs) { return lhs.num * rhs.den == rhs.num * lhs.den; } // 支持 <=> struct Rational_2 { int num; int den; // > 0 }; inline constexpr std::weak_ordering operator<=>(Rational_2 lhs, Rational_2 rhs) { return lhs.num * rhs.den <=> rhs.num * lhs.den; } void print(std::weak_ordering value) { if (value == 0) std::cout << "equal"; else if (value < 0) std::cout << "less"; else std::cout << "greater"; std::cout << "\n"; } int main() { Rational_1 a{1, 2}; Rational_1 b{3, 4}; // print(a <=> b); // 不工作 print(std::compare_3way(a, b)); // 工作,默认到 < 和 == Rational_2 c{6, 5}; Rational_2 d{8, 7}; print(c <=> d); // 工作 print(std::compare_3way(c, d)); // 工作 }
输出:
less greater greater
[编辑] 参阅
| (C++20) |
用三路比较比较两个范围 (函数模板) |
| (C++20) |
三路比较的结果类型,仅支持相等/不相等,且可替换 (类) |
| (C++20) |
三路比较的结果类型,仅支持相等/不相等,且不可替换 (类) |
| (C++20) |
三路比较的结果类型,支持所有 6 种运算符且可替换 (类) |
| (C++20) |
三路比较的结果类型,支持所有 6 种运算符且不可替换 (类) |
| (C++20) |
三路比较的结果类型,支持所有 6 种运算符,不可替换,并允许不可比较的值 (类) |

