constexpr auto synth-three-way = // (1) C++20
[]<class T, class U>(const T& t, const U& u)
requires requires {
{ t < u } -> boolean-testable ;
{ u < t } -> boolean-testable ;
}
{
if constexpr (three_way_comparable_with<T, U>) {
return t <=> u;
} else {
if (t < u) return weak_ordering::less;
if (u < t) return weak_ordering::greater;
return weak_ordering::equivalent;
}
};
template <class T, class U=T>
using synth-three-way-result =
decltype(synth-three-way(declval<T&>(), declval<U&>())); // (2) C++20
概要
- (1) : 型
T
と型U
が三方比較可能であればそれを行い、そうでなければweak_ordering
として三方比較を実装して関数オブジェクト - (2) :
synth-three-way-result
での比較結果の型
バージョン
言語
- C++20
参照
- P1614R2 The Mothership has Landed
- C++20での三方比較演算子の追加と、関連する演算子の自動導出