Namespaces
Variants

std::common_comparison_category

От ru.cppreference.net
 
 
Библиотека утилит
Поддержка языка
Поддержка типов (базовые типы, RTTI)
Макросы проверки возможностей библиотеки (C++20)
Программные утилиты
Функции с переменным числом аргументов
Поддержка корутин (C++20)
Поддержка контрактов (C++26)
Трёхстороннее сравнение
(C++20)
(C++20)(C++20)(C++20)    
(C++20)(C++20)(C++20)

Общие утилиты
Операторы отношения (устарело в C++20)
 
Определён в заголовке <compare>
template< class... Ts >
struct common_comparison_category
{
    using type = /* see below */ ;
};
(начиная с C++20)

Шаблон класса std::common_comparison_category предоставляет псевдоним (в виде typedef-члена type) для самой строгой категории сравнения, к которой могут быть преобразованы все аргументы шаблона Ts....

В деталях, общий тип сравнения для списка из n типов T0...Tn-1 определяется следующим образом:

Параметры шаблона

...Ts - возможно пустой список типов

Вспомогательный шаблон

template < class ... Ts >
using common_comparison_category_t = common_comparison_category < Ts... > :: type ;
(начиная с C++20)

Типы членов

Тип члена Определение
type наиболее сильная общая категория сравнения (как определено выше)

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

namespace detail
{
    template<unsigned int>
    struct common_cmpcat_base     { using type = void; };
    template<>
    struct common_cmpcat_base<0u> { using type = std::strong_ordering; };
    template<>
    struct common_cmpcat_base<2u> { using type = std::partial_ordering; };
    template<>
    struct common_cmpcat_base<4u> { using type = std::weak_ordering; };
    template<>
    struct common_cmpcat_base<6u> { using type = std::partial_ordering; };
} // пространство имён detail
template<class...Ts>
struct common_comparison_category :
    detail::common_cmpcat_base<(0u | ... |
        (std::is_same_v<Ts, std::strong_ordering>  ? 0u :
         std::is_same_v<Ts, std::weak_ordering>    ? 4u :
         std::is_same_v<Ts, std::partial_ordering> ? 2u : 1u)
    )> {};

Пример

Смотрите также

тип результата трёхстороннего сравнения, который поддерживает все 6 операторов и является заменяемым
(class)
тип результата трёхстороннего сравнения, который поддерживает все 6 операторов и не является заменяемым
(class)
тип результата трёхстороннего сравнения, который поддерживает все 6 операторов, не является заменяемым и допускает несравнимые значения
(class)