Daily bit(e) C++. std::compare_strong_order_fallback, std::compare_weak_order_fallback, std::compare_partial_order_fallback
Daily bit(e) C++ 50, соединение устаревшего кода с кодом, использующим трехстороннее сравнение C++20.

Трехстороннее сравнение, введенное в C++20, может значительно упростить реализацию и композицию функций сравнения. Однако оператор <=> будет работать только с типами, реализующими трехстороннее сравнение.
Если реализация трехстороннего сравнения невозможна, вызывающий код может вместо этого использовать вспомогательные функции std::compare_strong_order_fallback, std::compare_weak_order_fallback и std::compare_partial_order_fallback.
Эти вспомогательные функции будут работать с оператором <=> и функциями сравнения старого стиля.
Для сильного и слабого вариантов требуется только сравнение аргументов с помощью операторов == и <. Частичный вариант также требует, чтобы аргументы были сравнимы с помощью оператора < при перестановке (т.е. a<b и b<a).
#include <compare>
// Тип с поддержкой сравнения в старом стиле
struct Coord
{
int x;
int y;
friend bool operator< (const Coord& left, const Coord& right)
{
if (left.x == right.x)
return left.y < right.y;
return left.x < right.x;
}
friend bool operator== (const Coord& left, const Coord& right)
{
return left.x == right.x && left.y == right.y;
}
};
Coord a{1, 2}, b{2, 2};
// Не скомпилируется, тип не реализует operator<=>
// auto v = a <=> b;
// Создаст strong_ordering, используя операторы == и <
auto s = std::compare_strong_order_fallback(a,b);
// std::is_lt(s) == true
// decltype(s) == std::strong_ordering
// Создаст weak_ordering, используя операторы == и <
auto w = std::compare_weak_order_fallback(a,b);
// std::is_lt(w) == true
// decltype(w) == std::weak_ordering
// Создаст partial_ordering, используя операторы == и < (оба a < b, b < a)
auto p = std::compare_partial_order_fallback(a,b);
// std::is_lt(p) == true
// decltype(p) == std::partial_ordering
