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