std::compare_three_way_result
Материал из cppreference.com
Определено в заголовочном файле <compare>
|
||
template<class T, class U = T> struct compare_three_way_result; |
(начиная с C++20) | |
Пусть t
и u
обозначают lvalue const std::remove_reference_t<T> и const std::remove_reference_t<U> соответственно, если выражение t <=> u правильно сформировано, предоставляет элемент typedef type
, равный decltype(t <=> u), иначе элемента type
нет.
Поведе��ие программы, добавляющей специализации для std::compare_three_way_result
не определено.
Содержание |
[править] Типы элементы
Имя | Определение |
type
|
тип результата operator<=> для константного lvalue T и U
|
[править] Вспомогательные типы
template<class T, class U = T> using compare_three_way_result_t = typename compare_three_way_result<T, U>::type; |
(начиная с C++20) | |
[править] Возможная реализация
// рекомендовано Кейси Картер // смотрите также: https://github.com/microsoft/STL/pull/385#discussion_r357894054 template<class T, class U = T> using compare_three_way_result_t = decltype( std::declval<const std::remove_reference_t<T>&>() <=> std::declval<const std::remove_reference_t<U>&>() ); template<class T, class U = T> struct compare_three_way_result {}; template<class T, class U> requires requires { typename compare_three_way_result_t<T, U>; } struct compare_three_way_result<T, U> { using type = compare_three_way_result_t<T, U>; }; |
[править] Пример
Запустить этот код
#include <compare> #include <iostream> #include <type_traits> template <class Ord> void print_cmp_type() { if constexpr (std::is_same_v<Ord, std::strong_ordering>) std::cout << "строгий порядок\n"; else if constexpr (std::is_same_v<Ord, std::weak_ordering>) std::cout << "нестрогий порядок\n"; else if constexpr (std::is_same_v<Ord, std::partial_ordering>) std::cout << "частичный порядок\n"; else std::cout << "недопустимый тип результата сравнения\n"; } int main() { print_cmp_type<std::compare_three_way_result_t<int>>(); print_cmp_type<std::compare_three_way_result_t<double>>(); }
Вывод:
строгий порядок частичный порядок
[править] Смотрите также
(C++20) |
тип результата трёхстороннего сравнения, который поддерживает все 6 операторов, невзаимозаменяемый и допускает несравнимые значения (класс) |
(C++20) |
тип результата трёхстороннего сравнения, который поддерживает все 6 операторов и невзаимозаменяемый (класс) |
(C++20) |
тип результата трёхстороннего сравнения, который поддерживает все 6 операторов и может быть взаимозаменяемым (класс) |