Spec-Zone.ru › C++

std::compare_three_way_result

Определено в заголовке <compare>
template< class T, class U = T >
struct compare_three_way_result;
(начиная с C++20)

Пусть t и u обозначают lvalue-значения типа const std::remove_reference_t<T> и const std::remove_reference_t<U> соответственно. Если выражение t <=> u корректно, то предоставляет псевдоним типа-члена type, равный decltype(t <=> u); в противном случае члена type нет.

Если программа добавляет специализации для std::compare_three_way_result, поведение не определено.

Типы-члены

Имя Определение
type тип результата operator<=> для lvalue-значений типа T и U с квалификатором const

Вспомогательные типы

template< class T, class U = T >
using compare_three_way_result_t = compare_three_way_result<T, U>::type;
(начиная с C++20)

Возможная реализация

// recommended by Casey Carter
// see also: https://github.com/microsoft/STL/pull/385#discussion_r357894054
template<class T, class U = T>
using compare_three_way_result_t = decltype(
    std::declval<const std::remove_reference_t<T>&>() <=>
    std::declval<const std::remove_reference_t<U>&>()
);

template<class T, class U = T>
struct compare_three_way_result {};

template<class T, class U>
    requires requires { typename compare_three_way_result_t<T, U>; }
struct compare_three_way_result<T, U>
{
    using type = compare_three_way_result_t<T, U>;
};

Пример

#include <compare>
#include <iostream>
#include <type_traits>

template<class Ord>
void print_cmp_type()
{
    if constexpr (std::is_same_v<Ord, std::strong_ordering>)
        std::cout << "strong ordering\n";
    else if constexpr (std::is_same_v<Ord, std::weak_ordering>)
        std::cout << "weak ordering\n";
    else if constexpr (std::is_same_v<Ord, std::partial_ordering>)
        std::cout << "partial ordering\n";
    else
        std::cout << "illegal comparison result type\n";
}

int main()
{
    print_cmp_type<std::compare_three_way_result_t<int>>();
    print_cmp_type<std::compare_three_way_result_t<double>>();
}

Вывод:

strong ordering
partial ordering

См. также

partial_ordering
(C++20)
тип результата трёхстороннего сравнения, поддерживающий все 6 операторов, не являющийся взаимозаменяемым и допускающий несравнимые значения
(класс)
weak_ordering
(C++20)
тип результата трёхстороннего сравнения, поддерживающий все 6 операторов и не являющийся взаимозаменяемым
(класс)
strong_ordering
(C++20)
тип результата трёхстороннего сравнения, поддерживающий все 6 операторов и являющийся взаимозаменяемым
(класс)

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/utility/compare/compare_three_way_result

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API