[英]What are the similarities and differences between C++'s concepts and Rust's traits?
在Rust中,抽象的主要工具是特征 。 在C ++中,有两种抽象工具:抽象类和模板。 为了摆脱使用模板的一些缺点(例如,难以读取错误消息),C ++引入了 “命名的需求集”的 概念 。
这两个功能似乎非常相似:
但据我所知,也存在显着差异。 例如,C ++的概念似乎定义了一组必须有效而不是列出函数签名的表达式。 但是那里有很多不同且令人困惑的信息(也许是因为概念只存在于C ++ 20中?)。 这就是为什么我想知道: C ++的概念和Rust的特征之间有什么区别和相似之处?
是否存在仅由概念或特征提供的功能? 比如Rust的相关类型和consts怎么样? 或者通过多个特征/概念绑定一个类型?
免责声明:我还没有使用过概念,我所知道的所有概念都是从各种提案和cppreference中收集的,所以请大家用这个答案。
Rust Traits既用于编译时多态,也用于运行时多态; 概念只是关于编译时多态性。
概念和特征之间的最大区别在于,概念使用结构类型,而特征使用名义类型 :
impl Trait for Type
用于显式指示类型实现Trait。 有许多后果; 一般来说,从可维护性的角度来看,名义打字更好 - 向特征添加一个要求 - 而结构打字更好地是一个桥接的第三方库 - 来自库A的类型可以满足来自库B的概念而无需他们意识到彼此的。
特征是强制性的:
概念完全是可选的:
注意:约束由requires
子句引入,并指定ad-hoc要求或基于Concepts的要求。
一组可表达的要求是不同的:
Rust没有ad-hoc重载的概念,只有Traits才会发生重载,而且还不能进行专门化。
C ++约束可用于从最不具体到最具体的“排序”重载,因此编译器可以自动选择满足要求的最具体的重载。
注意:在此之前,要么在C ++中使用SFINAE或标签调度来实现选择; 健美操需要使用开放式过载套件。
如何使用此功能还不是很清楚。
鲁斯特要求机制是纯加(连词,又名&&
),与此相反,在C ++ requires
条款可以包含析取(又名||
)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.