最終更新日時(UTC):
が更新

履歴 編集

function template
<tuple>

std::operator<=>(C++20)

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以降)

効果

tuの辞書順比較を行う。

長さ0のtupleの場合は、t <=> ustrong_ordering::equalを返す。そうでなければ、以下と等価:

if (auto c = synth-three-way(get<0>(t), get<0>(u)); c != 0)
  return c;
return t tail <=> u tail;

ここでrtailは、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

処理系

参照