std::common_comparison_category - cppreference.com

From cppreference.com

template<class...Ts>structcommon_comparison_category{usingtype=/* 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:

If any Ti is not a comparison category type (

std::partial_ordering

,

std::weak_ordering

,

std::strong_ordering

), U is void.

Otherwise, if at least one Ti is

std::partial_ordering

, U is

std::partial_ordering

.

Otherwise, if at least one Ti is

std::weak_ordering

, U is

std::weak_ordering

.

Otherwise (if every Ti is

std::strong_ordering

, or if the list is empty), U is

std::strong_ordering

.

Template parameters

...Ts - a possibly empty list of types Helper template

template<class...Ts>usingcommon_comparison_category_t=common_comparison_category<Ts...>::type;(since C++20)Member types

Member type Definition typethe strongest common comparison category (as defined above) Possible implementation

namespacedetail{template<unsignedint>structcommon_cmpcat_base{usingtype=void;};template<>structcommon_cmpcat_base<0u>{usingtype=std::strong_ordering;};template<>structcommon_cmpcat_base<2u>{usingtype=std::partial_ordering;};template<>structcommon_cmpcat_base<4u>{usingtype=std::weak_ordering;};template<>structcommon_cmpcat_base<6u>{usingtype=std::partial_ordering;};}// namespace detailtemplate<class...Ts>structcommon_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

(C++20)

the result type of 3-way comparison that supports all 6 operators and is substitutable
(class)

[edit]

(C++20)

the result type of 3-way comparison that supports all 6 operators and is not substitutable
(class)

[edit]

(C++20)

the result type of 3-way comparison that supports all 6 operators, is not substitutable, and allows incomparable values
(class)

[edit]