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 имеет корректный вид, предоставляет член typedef type, равный decltype(t <=> u), в противном случае члена type нет.

Поведение программы, добавляющей специализации для std::compare_three_way_result, не определено.

Типы членов

Название Определение
type тип результата operator<=> для const-квалифицированных lvalue T и U

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

template< class T, class U = T >
using compare_three_way_result_t = typename 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)
тип результата 3-стороннего сравнения, поддерживающий все 6 операторов, не заменяемый и допускающий несравнимые значения
(класс)
weak_ordering
(C++20)
тип результата 3-стороннего сравнения, поддерживающий все 6 операторов и не заменяемый
(класс)
strong_ordering
(C++20)
тип результата 3-стороннего сравнения, поддерживающий все 6 операторов и заменяемый
(класс)

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

Spec-Zone.ru

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