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

履歴 編集

concept
<concepts>

std::regular(C++20)

namespace std {
  template<class T>
  concept regular = semiregular<T> && equality_comparable<T>;
}

概要

regularは、任意の型Tsemiregularであり、等値比較可能であることを表すコンセプトである。

正則性

正則(regular)な型とはつまり以下の性質を備えた型である。

  • ムーブ構築・代入可能
  • コピー構築・代入可能
  • デフォルト構築可能
  • swap可能
  • == !=による等値比較可能

このような正則な型とは、int型などの基本型の様に扱うことのできる型を表している。

ここから等値比較可能という性質を弱めたものは、半正則な型と呼ばれる。

#include <iostream>
#include <concepts>

template<std::regular T>
void f(const char* name) {
  std::cout << name << " is regular" << std::endl;
}

template<typename T>
void f(const char* name) {
  std::cout << name << " is not regular" << std::endl;
}


struct regular {
  regular() = default;
  regular(const regular&) = default;
  regular& operator=(const regular&) = default;

  bool operator==(const regular&) const = default;
};

struct semiregular {
  semiregular() = default;
  semiregular(const semiregular&) = default;
  semiregular& operator=(const semiregular&) = default;
};

int main() {
  f<int>("int");
  f<double>("double");
  f<std::nullptr_t>("std::nullptr_t");
  f<std::size_t>("std::size_t");
  f<regular>("regular");

  std::cout << "\n";
  f<void>("void");
  f<semiregular>("semiregular");
}

出力

int is regular
double is regular
std::nullptr_t is regular
std::size_t is regular
regular is regular

void is not regular
semiregular is not regular

バージョン

言語

  • C++20

処理系

関連項目

参照