namespace std {
template<class T>
concept regular = semiregular<T> && equality_comparable<T>;
}
概要
regular
は、任意の型T
がsemiregular
コンセプトを満たし、それに加えて等値比較可能であることを表すコンセプトである。
正則性
正則(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");
}
40
semiregular& operator=(const semiregular&) = default;
#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;
出力
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
処理系
- Clang: ??
- GCC: 10.1 ✅
- Visual C++: 2019 Update 3 ✅