在Rust中,抽象的主要工具是traits。在C++中,有两种抽象工具:抽象类和模板。为了摆脱使用模板的一些缺点(例如难以阅读的错误消息),C++引入了概念,它们是"命名的需求集"。
这两个特性看起来相当相似:
- 定义trait/concept是通过列出要求来完成的。 - 两者都可以用于限制泛型/模板类型参数。 - Rust traits和带有概念的C++模板都是单态化的(我知道Rust traits也可以与动态调度一起使用,但那是另一个故事)。
但据我所知,也存在显着的差异。例如,C++的概念似乎定义了一组必须有效的表达式,而不是列出函数签名。但是,那里有很多不同和令人困惑的信息(可能是因为概念只在C++20中推出?)。这就是为什么我想知道:C++的概念和Rust的traits之间到底有什么区别和相似之处? 是否有任何只由概念或traits提供的功能?例如,Rust的关联类型和常数如何处理?或将类型限定为多个traits/concepts?
这两个特性看起来相当相似:
- 定义trait/concept是通过列出要求来完成的。 - 两者都可以用于限制泛型/模板类型参数。 - Rust traits和带有概念的C++模板都是单态化的(我知道Rust traits也可以与动态调度一起使用,但那是另一个故事)。
但据我所知,也存在显着的差异。例如,C++的概念似乎定义了一组必须有效的表达式,而不是列出函数签名。但是,那里有很多不同和令人困惑的信息(可能是因为概念只在C++20中推出?)。这就是为什么我想知道:C++的概念和Rust的traits之间到底有什么区别和相似之处? 是否有任何只由概念或traits提供的功能?例如,Rust的关联类型和常数如何处理?或将类型限定为多个traits/concepts?