std::common...son_category(3)
okay so bestie, welcome to the std::common...son_category(3) page from the C++ Standard Libary β yes, the header literally spells it C++ Standard Libary, and the title truncates to std::common...son_category(3) like it ran out of breath mid-sentence π. The actual main character is std::common_comparison_category, and she is serving comparison-category-commonality realness β¨.
πΈ NAME πΈ
std::common_comparison_category β std::common_comparison_category (the name said what it said, periodt π
).
β¨ Synopsis β¨
Defined in header <compare>:
template< class... Ts >
struct common_comparison_category
{ (since C++20)
using type = /* see below */ ;
};
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 T[0]...T[n-1] is defined as follows:
- If any
T[i]is not a comparison category type (std::partial_ordering,std::weak_ordering,std::strong_ordering),Uisvoid. - Otherwise, if at least one
T[i]isstd::partial_ordering,Uisstd::partial_ordering. - Otherwise, if at least one
T[i]isstd::weak_ordering,Uisstd::weak_ordering. - Otherwise (if every
T[i]isstd::strong_ordering, or if the list is empty),Uisstd::strong_ordering.
π§© Template parameters π§©
...Tsβ a possibly empty list of types
π οΈ Helper template π οΈ
okay so there's also this helper alias, and it's giving "one-line convenience, no cap" π:
template< class... Ts >
using common_comparison_category_t =
common_comparison_category<Ts...>::type;
β¨ since C++20 β¨
π Member types π
typeβ the strongest common comparison category (as defined above)
π Possible implementation π
here's a possible implementation, and no I did not invent it, it's right there in the original π:
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 π§ͺ
This section is incomplete Reason: no example
π See also π
strong_ordering(C++20) β the result type of 3-way comparison that supports all 6 operators and is substitutable (class)weak_ordering(C++20) β the result type of 3-way comparison that supports all 6 operators and is not substitutable (class)partial_ordering(C++20) β the result type of 3-way comparison that supports all 6 operators, is not substitutable, and allows incomparable values (class)
π·οΈ Category π·οΈ
- Todo no example
and that's the whole page, babe π. this was std::common...son_category(3), brought to you by http://cppreference.com, version/date 2024.06.10 β go forth and compare responsibly πβ¨
π¦ where this page comes from
- nixpkgs unstable: stdman 2024.07.05
- opensuse-leap 16.0: stdman 2024.07.05-bp160.1.9 Β· MIT
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash-1017 on : a language model's rewrite of the original, under its terms