我正在尝试用 C++20 来理解
concepts
。 考虑以下(非常简单)的概念:
template <typename T>
concept Float = requires
{
std::floating_point<T>;
};
我可以通过两种方式使用这个概念编写模板类:
template <Float T>
class MyClass {
public:
MyClass(T val) : value{ val } {};
private:
T value;
};
或者我也可以
template <typename T> requires Float<T>
class MyClass {
public:
MyClass(T val) : value{ val } {};
private:
T value;
};
在这个特定的示例中,它们的行为完全相同。 但情况总是如此吗? 是否存在使用
template <...> requires ...
语法更容易表达某些约束的情况? 或者这仅仅是一种风格偏好/惯例?
我现在唯一能想到的是,使用
template <...> requires ...
语法可以允许您表示多个模板参数之间的关系约束,而 template <CONCEPT T>
语法仅允许您表示对单个参数的约束?
任何指导将不胜感激。
使用概念名称代替类型名称始终是您可以以长格式执行的操作的简写。然而,在某些情况下,长格式的等价物更难以处理。
例如:
template <Concept auto value>
class foo {...};
//becomes
template <auto value> requires Concept<decltype(value)>
class foo {...};
之间没有区别:
template <Float T>
和
template <typename T> requires Float<T>
它们的意思是一样的。如果您声明一个模板,然后稍后定义它,则必须在两个地方使用相同的语法 - 但这两种语法确实意味着相同的事情。
这纯粹是一个偏好问题。 type-constraint 语法受到更多限制(只能用于约束类型),但更具可读性。