Пространства имён
Варианты
Действия

std::common_comparison_category

Материал из cppreference.com
 
 
Библиотека утилит
Языковая поддержка
Поддержка типов (базовые типы, RTTI)
Макросы тестирования функциональности библиотеки (C++20)    
Управление динамической памятью
Программные утилиты
Поддержка сопрограмм (C++20)
Вариативные функции
Трёхстороннее сравнение (C++20)
(C++20)
(C++20)(C++20)(C++20)(C++20)(C++20)(C++20)
Общие утилиты
Дата и время
Функциональные объекты
Библиотека форматирования (C++20)
(C++11)
Операторы отношения (устарело в C++20)
Целочисленные функции сравнения
(C++20)(C++20)(C++20)    
(C++20)
Операции обмена и типа
(C++14)
(C++11)
(C++11)
(C++11)
(C++17)
Общие лексические типы
(C++11)
(C++17)
(C++17)
(C++17)
(C++11)
(C++17)
(C++23)
Элементарные преобразования строк
(C++17)
(C++17)
 
<tbody> </tbody>
Определено в заголовочном файле <compare>
template<class... Ts> struct common_comparison_category { using type = /*cмотрите ниже*/ ; };
(начиная с C++20)

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


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

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

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

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

<tbody> </tbody>
template< class... Ts > using common_comparison_category_t = typename 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 операторов и может быть взаимозаменяемым
(класс) [править]
тип результата трёхстороннего сравнения, который поддерживает все 6 операторов и невзаимозаменяемый
(класс) [править]
тип результата трёхстороннего сравнения, который поддерживает все 6 операторов, невзаимозаменяемый и допускает несравнимые значения
(класс) [править]