模板的多个概念 class
multiple concepts for template class
我有下面的 class,但它只适用于浮点数。如何也添加整数?那是多个 requires 语句?或者有什么可以包含所有数字类型的东西吗?
或者有更好的方法?
#ifndef COMPLEX_H
#define COMPLEX_H
#include <concepts>
#include <iostream>
template <class T>
requires std::floating_point<T> // How to add integral, signed integral, etc
class Complex {
private:
T re = 0;
T im = 0;
public:
Complex() {
std::cout << "Complex: Default constructor" << std::endl;
};
Complex(T real) : re{re} {
std::cout << "Complex: Constructing from assignement!" << std::endl;
};
bool operator<(const Complex<T>& other) {
return re < other.re && im < other.im;
}
};
#endif // COMPLEX_H
您可以||
您的概念,例如
requires std::floating_point<T> || std::integral<T>
你也可以这样创建一个概念
template <typename T>
concept arithmetic = std::integral<T> || std::floating_point<T>;
然后您可以将此概念用于您的 class
template <class T>
requires arithmetic<T>
class Complex
{
...
已经有一个 std::is_arithmetic
类型特征可以与你的 requires 子句一起使用:
#include <type_traits>
template <class T>
requires std::is_arithmetic_v<T>
class Complex
{
...
请注意,如果您为此使用自定义 Arithmetic
概念(我想标准库会在某个时候提供一个但说您不耐烦),那么写起来很干净:
template <Arithmetic T>
class Complex
{
...
我有下面的 class,但它只适用于浮点数。如何也添加整数?那是多个 requires 语句?或者有什么可以包含所有数字类型的东西吗?
或者有更好的方法?
#ifndef COMPLEX_H
#define COMPLEX_H
#include <concepts>
#include <iostream>
template <class T>
requires std::floating_point<T> // How to add integral, signed integral, etc
class Complex {
private:
T re = 0;
T im = 0;
public:
Complex() {
std::cout << "Complex: Default constructor" << std::endl;
};
Complex(T real) : re{re} {
std::cout << "Complex: Constructing from assignement!" << std::endl;
};
bool operator<(const Complex<T>& other) {
return re < other.re && im < other.im;
}
};
#endif // COMPLEX_H
您可以||
您的概念,例如
requires std::floating_point<T> || std::integral<T>
你也可以这样创建一个概念
template <typename T>
concept arithmetic = std::integral<T> || std::floating_point<T>;
然后您可以将此概念用于您的 class
template <class T>
requires arithmetic<T>
class Complex
{
...
已经有一个 std::is_arithmetic
类型特征可以与你的 requires 子句一起使用:
#include <type_traits>
template <class T>
requires std::is_arithmetic_v<T>
class Complex
{
...
请注意,如果您为此使用自定义 Arithmetic
概念(我想标准库会在某个时候提供一个但说您不耐烦),那么写起来很干净:
template <Arithmetic T>
class Complex
{
...