C++20引入了三路比较运算符(也称为太空船运算符,<=>
),它允许同时比较两个值,并返回它们的相对顺序。这个运算符简化了需要定义多个比较运算符(如==
、!=
、<
、<=
、>
、>=
)的类的代码,提高了代码的简洁性和可读性。以下是三路比较运算符的详细介绍和示例代码:
1. 基本用法
三路比较运算符返回一个std::strong_ordering
、std::weak_ordering
或std::partial_ordering
类型的值,表示小于、等于或大于。
#include <compare>
#include <iostream>
void basicUsage() {
int a = 5, b = 10;
auto result = a <=> b;
if (result < 0) {
std::cout << "a < b" << std::endl;
} else if (result == 0) {
std::cout << "a == b" << std::endl;
} else {
std::cout << "a > b" << std::endl;
}
}
2. 在类中使用
你可以在自定义类型中重载三路比较运算符来提供全面的比较功能。
#include <compare>
#include <iostream>
class Point {
public:
int x, y;
auto operator<=>(const Point&) const = default; // 默认比较生成
};
void classUsage() {
Point p1{1, 2}, p2{1, 3};
if (p1 <=> p2 == 0) {
std::cout << "p1 == p2" << std::endl;
} else {
std::cout << "p1 != p2" << std::endl;
}
}
3. 自定义比较逻辑
当默认生成的比较逻辑不符合需求时,你可以为三路比较运算符提供自定义实现。
#include <compare>
#include <iostream>
class Distance {
public:
int meters;
std::strong_ordering operator<=>(const Distance& other) const {
return meters <=> other.meters;
}
};
void customComparison() {
Distance d1{100}, d2{200};
if (d1 <=> d2 < 0) {
std::cout << "d1 < d2" << std::endl;
} else if (d1 <=> d2 == 0) {
std::cout << "d1 == d2" << std::endl;
} else {
std::cout << "d1 > d2" << std::endl;
}
}
4. 使用结果进行链式比较
三路比较运算符的结果可以用于链式比较,提高代码的可读性和编写效率。
#include <compare>
#include <iostream>
void chainComparison() {
int a = 5, b = 5, c = 10;
if (auto result = a <=> b; result == 0) {
std::cout << "a == b, ";
std::cout << "and they are " << ((a <=> c) < 0 ? "less" : "greater") << " than c" << std::endl;
}
}
通过上述示例可以看到三路比较运算符如何在现代C++中被用于简化比较逻辑,使得代码更加简洁且易于理解。