C++的“概念”和鸭子类型有什么关系?

10

有一个早期的问题(8年前!)关于模板和鸭子类型之间的关系,链接在这里:C++模板和鸭子类型有什么关系? 我借用并修改了这个标签,用于我关于C++新功能的问题。

随着C++20的到来,将会有一个名为"concept"的新功能,看起来更像是一种鸭子类型的特性。是否正确地认为新的C++ "concept"等价于C++的鸭子类型?如果不是,那么它们有什么不同之处?

2个回答

4
随着C++20的推出,将出现“概念(concept)”这个新特性,看起来更像一种鸭子类型(duck-typing)的特性。
并不完全是这样。
如果我们接受模板已经是编译时鸭子类型的观点,那么我不同意链接问题中被接受的答案和维基百科页面上的描述,因为在编译时而不是运行时做“相同的事情”并不足以让它有一个完全不同的名称。例如静态多态性与动态多态性的区别。所以概念并不比模板更加鸭子类型。
另一个论点是,鸭子类型通常假设您通过“尝试使用类型”来表达类型约束。而概念比模板更远离这种模式。
如果我们(错误地)同意链接问题中被接受的答案和维基百科的解释,那么:
- 模板不是鸭子类型的示例是因为它们发生在编译时。 - 概念也发生在编译时。 - 因此证毕。
概念所做的就是将模板已经完成的工作(可能或可能不是鸭子类型)提升到了更精细的选项上进行特化,并且更清晰地表达类型约束,希望能够生成更好的错误信息。
鸭子类型的质量在所有这些操作下都是不变的。

这里的另一个论点是,鸭子类型通常假定您通过尝试使用该类型来表达类型约束。概念比模板更远离这个模型。这看起来对我来说是“正确”的答案。虽然我在阅读规范时没有得出这一点,但现在您已经说出来了,显然是正确的。 - Brick
我倾向于将概念视为更像 Haskell 的类型类:它们用于明确那些否则仅隐含的事物。 - Useless

3

这真的取决于你如何定义“鸭子类型”。

如果您使用字典定义(“如果它走起来像一只鸭子,嘎嘎声像一只鸭子,那么它一定是一只鸭子”),那么预先概念模板是鸭子类型的一种形式

认为模板不是鸭子类型的论点本质上是从术语通常使用的方式进行的:被称为使用“鸭子类型”的语言(Python、Lua等)在运行时执行大部分/全部验证以确保鸭子实际上是一只鸭子。模板在编译时执行其等效操作,因此它们不代表鸭子类型。

请注意,概念不会影响这两种解释中的任何一种。如果您认为运行时检查是“鸭子类型”本质的基本部分,则即使使用概念,模板也不是鸭子类型。

如果你觉得模板是鸭子类型的预先概念,那么在概念之后你可能会有同样的感受。反之亦然。

3
因此,模板=编译时鸭子类型 :-) - einpoklum

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接