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 предоставляет псевдоним (как член-typedef 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 = 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; };
} // 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)
результат сравнения в 3-х направлениях, поддерживающий все 6 операторов и подставляемый
(класс)
weak_ordering
(C++20)
результат сравнения в 3-х направлениях, поддерживающий все 6 операторов и не подставляемый
(класс)
partial_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/common_comparison_category

Spec-Zone.ru

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