Daily bit(e) C++. std::compare_strong_order_fallback, std::compare_weak_order_fallback, std::compare_partial_order_fallback

Добавлено 30 июля 2026 в 01:06

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

Daily bit(e) C++

Трехстороннее сравнение, введенное в 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

Пример на Compiler Explorer

Теги

C++ / CppDaily bit(e) C++Программирование