std::common_comparison_category - cppreference.com
Namespaces
Variants

std::common_comparison_category

From cppreference.com
 
 
Utilities library
General utilities
Relational operators (deprecated in C++20)
 
Defined in header <compare>
template< class... Ts >
struct common_comparison_category
{
    using type = /* see below */ ;
};
(since C++20)

The class template std::common_comparison_category provides an alias (as the member typedef type) for the strongest comparison category to which all of the template arguments Ts... can be converted.

In detail, the common comparison type of a list of n types T0...Tn-1 is defined as follows:

Template parameters

...Ts - a possibly empty list of types

Helper template

template< class... Ts >
using common_comparison_category_t = common_comparison_category<Ts...>::type;
(since C++20)

Member types

Member type Definition
type the strongest common comparison category (as defined above)

Possible implementation

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

Example

See also