namespace std {
template<class... TTypes, class... UTypes>
constexpr common_comparison_category_t<synth-three-way-result<TTypes, UTypes>...>
operator<=>(const tuple<TTypes...>& t, const tuple<UTypes...>& u); // (1) C++20
template<class... TTypes, tuple-like UTuple>
constexpr common_comparison_category_t<synth-three-way-result<TTypes, Elems>...>
operator<=>(const tuple<TTypes...>& t, const UTuple& u); // (2) C++23
// (2) の Elems は 型パラメータパック
// tuple_element_t<0, UTuple>, tuple_element_t<1, UTuple>, ...,
// tuple_element_t<tuple_size_v<UTuple> - 1, UTuple>
// を表す。
}
概要
2つのtuple
オブジェクトの三方比較を行う。また、tuple-like
なオブジェクトとの三方比較を行う。(C++23以降)
効果
t
とu
の辞書順比較を行う。
長さ0のtuple
の場合は、t <=> u
はstrong_ordering::equal
を返す。そうでなければ、以下と等価:
if (auto c = synth-three-way(get<0>(t), get<0>(u)); c != 0)
return c;
return t tail <=> u tail;
ここでr
tailは、r
の最初の要素以外のすべてを含むtuple
である。
備考
- この演算子により、以下の演算子が使用可能になる (C++20):
operator<
operator<=
operator>
operator>=
例
#include <cassert>
#include <tuple>
#include <string>
int main()
{
std::tuple<int, char, const char*> t1(1, 'a', "hello");
std::tuple<int, char, std::string> t2(1, 'a', "hello");
std::tuple<int, char, std::string> t3(1, 'b', "world");
assert((t1 <=> t2) == 0); // ※比較可能であれば型は異なっていてもかまわない
assert(t1 < t3);
assert(t1 <= t3);
assert(t3 > t1);
assert(t3 >= t1);
}
出力
true
false
バージョン
言語
- C++20
処理系
- Clang:
- GCC: 10 ✅
- Visual C++: ??
参照
- P1614R2 The Mothership has Landed
- C++20での三方比較演算子の追加と、関連する演算子の自動導出