Пример использования в реальном мире для оператора космического корабля
Определение оператора космического корабля должно иметь четкое определение порядка, но влияет ли это на то, как ваш клиентский код или просто как определить ваши операторы сравнения классов?
Поскольку в другом посте отсутствуют примеры из реальной жизни, я не до конца понимаю эту часть.
Другой так пост про оператора космического корабля:
2 ответа
<=>
позволяет ленивый способ также быть быстрым способом. Вы не меняете свой код клиента.
Клиенты могут увидеть преимущества в производительности, когда был using std::rel_ops
(или же boost::ordered
так далее).
Пример
// old and busted
struct Person : boost::totally_ordered<Person>
{
std::string firstname;
std::string lastname
bool operator<(const Person & other)
{
return std::tie(firstname, lastname)
< std::tie(other.firstname, other.lastname);
}
}
// new hotness
struct Person
{
std::string firstname;
std::string lastname;
auto operator<=>(const Person &) = default;
}
int main()
{
Person person1 { "John", "Smith" };
Person person2 { "John", "Smith" };
std::cout << person2 <= person1 << std::endl;
}
Вы просто сравниваете то, что вы всегда делали:
a < b
Просто под капотом одна из функций-кандидатов для этого выражения также найдет (a <=> b) < 0
и если этот кандидат существует и оказывается лучшим жизнеспособным кандидатом, то он вызывается.
Вы обычно не используете <=>
непосредственно в "код клиента", вы просто используете сравнения, которые вы хотите напрямую.
Например, учитывая:
struct X {
int i;
// this can be = default, just writing it out for clarity
strong_ordering operator<=>(X const& rhs) const { return i <=> rhs.i; }
};
Выражение
X{42} < X{57};
будет оценивать как X{42} <=> X{57} < 0
(здесь нет <
кандидат, так <=>
не наоборот - тривиально лучший кандидат). X{42} <=> X{57}
оценивает как 42 <=> 57
который strong_ordering::less
, И это < 0
возвращается true
, Следовательно, начальное выражение true
... как и ожидалось.
Тот же оператор также напрямую дает нам, что X{57} > X{42}
, тот X{3} >= X{2}
, так далее.
Преимущество <=>
является то, что вам нужно написать только один оператор вместо четырех, этот оператор, как правило, гораздо проще написать, чем <
Вы можете правильно выразить различие между частичными и общими заказами, и их наложение обычно более производительно (например, в таких случаях, как string
).
Кроме того, нам не нужно жить в этом странном мире, где все делают вид, что operator<
это единственный оператор связи, который существует.