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)
)> {};
|
Пример
См. также
|
(C++20) | тип результата трёхстороннего сравнения, поддерживающий все 6 операторов и обладающий свойством подстановки (класс) |
|
(C++20) | тип результата трёхстороннего сравнения, поддерживающий все 6 операторов, но не обладающий свойством подстановки (класс) |
|
(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