在Rust中,抽象的主要工具是 traits 。在C ++中,有两种用于抽象的工具:抽象类和模板。为了摆脱使用模板的一些缺点(例如,难以阅读的错误消息),C ++引入了"named sets of requirements"的概念。
两个功能似乎都非常相似:
但是据我了解,也存在显着差异。例如,C ++的概念似乎定义了一组必须有效的表达式,而不是列出函数签名。但是那里有很多不同且令人困惑的信息(也许是因为概念仅出现在C ++ 20中?)。这就是为什么我想知道: C ++概念和Rust的特征之间到底有什么相似之处?
是否只有概念或特征才提供功能?例如。 Rust的关联类型和const呢?还是用多个特征/概念来界定一个类型?
答案 0 :(得分:16)
免责声明:我还没有使用过概念,我对它们的了解仅来自各种建议和cppreference,因此请一answer而就。
铁锈特性既用于编译时多态,有时也用于运行时多态。概念仅与编译时多态有关。
概念和特征之间的最大区别是概念使用结构类型,而特征使用名义类型:
impl Trait for Type
用于显式指示类型实现了性状。有很多后果;通常,从可维护性的角度来看,标称键入更好-对特质增加了要求-而结构化键入更好地桥接了第三方库-库A的类型可以满足库B的概念而无需他们知道彼此。
必须遵守特质:
概念完全是可选的:
注意:约束由requires
子句引入,它指定临时需求或基于概念的需求。
可表达要求的集合不同:
Rust没有临时重载的概念,重载仅是由Traits发生的,还无法进行专门化。
C ++约束可用于按从最不特定到最特定的顺序“重载”排序,因此编译器可以自动选择满足要求的最特定的重载。
注意:在此之前,在C ++中将使用SFINAE或标记分派来实现选择。健美操需要使用开放式过载集。
我还不太清楚如何使用此功能。
Rust中的需求机制是纯加性的(连词,也称为&&
),相比之下,在C ++ requires
子句中可以包含析取词(也称为||
)。