Spec-Zone.ru › C++

std::common_comparison_category

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

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

Подробное определение общего типа сравнения для списка из n типов T0...Tn-1 выглядит следующим образом:

  • Если какой-либо Ti не является типом категории сравнения (std::partial_ordering, std::weak_ordering, std::strong_ordering), U — это void.
  • Иначе, если хотя бы один Ti — это std::partial_ordering, U — это std::partial_ordering.
  • Иначе, если хотя бы один Ti — это std::weak_ordering, U — это std::weak_ordering.
  • Иначе (если каждый Ti — это std::strong_ordering или список пуст), U — это std::strong_ordering.

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

...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; };
} // namespace 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)
    )> {};

Пример

См. также

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

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

Spec-Zone.ru

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