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

履歴 編集

concept
<concepts>

std::strict_weak_order(C++20)

namespace std {
  template<class R, class T, class U>
  concept strict_weak_order = relation<R, T, U>;
}

概要

strict_weak_orderは、型T, Uの間の二項関係Rが狭義の弱順序であることを表すコンセプトである。

モデル

relationのモデルである二項関係Rは、その引数型T, Uの間の狭義の弱順序関係を示す場合に限って、strict_weak_orderのモデルである。

#include <iostream>
#include <concepts>

template<typename R, typename T, typename U>
requires std::strict_weak_order<R, T, U>
void f(const char* name, const char* tname, const char* uname) {
  std::cout << name << " is strict weak order between " << tname << " and " << uname << std::endl;
}

template<typename R, typename T, typename U>
void f(const char* name, const char* tname, const char* uname) {
  std::cout << name << " is not strict weak order between " << tname << " and " << uname << std::endl;
}


struct S1 {
  int n = 0;
};

struct S2 {
  short m = 0;
};

// S1とS2の間の順序関係
struct strict_weak_order_s1s2 {

  bool operator()(S1 lhs, S1 rhs) const {
    return lhs.n < rhs.n;
  }

  bool operator()(S2 lhs, S2 rhs ) const {
    return lhs.m < rhs.m;
  }

  bool operator()(S1 lhs, S2 rhs) const {
    return lhs.n < rhs.m;
  }

  bool operator()(S2 lhs, S1 rhs) const {
    return lhs.m < rhs.n;
  }
};

int main() {
  f<strict_weak_order_s1s2, S1, S2>("strict_weak_order_s1s2", "S1", "S2");
  f<strict_weak_order_s1s2, S2, S1>("strict_weak_order_s1s2", "S2", "S1");
}

出力

strict_weak_order_s1s2 is strict weak order between S1 and S2
strict_weak_order_s1s2 is strict weak order between S2 and S1

バージョン

言語

  • C++20

処理系

関連項目

参照