【问题标题】:What's the relationship between C++ "concept" and duck typing?C++“概念”和鸭子类型有什么关系?
【发布时间】:2019-11-06 19:41:43
【问题描述】:

有一个较早的问题(8 年前!)关于模板和鸭子类型之间的关系:What's the relationship between C++ template and duck typing? 我已经借用并修改了我关于 C++ 新特性的问题的标语行。

随着 C++20 的出现,“概念”的新特性看起来更像鸭子打字特性。新的 C++“概念”等同于 C++ 的鸭子类型是否正确?如果不是,有什么不同?

【问题讨论】:

    标签: c++ c++20 duck-typing c++-concepts


    【解决方案1】:

    随着 C++20 的出现,“概念”的新特性看起来更像鸭子打字特性

    不是真的。

    1. 如果我们接受模板已经是编译时的鸭子类型

      • 我不同意链接问题和 Wikipedia 页面上接受的答案,因为在编译时而不是运行时做 相同的事情 并不是给它一个有说服力的理由完全不同的名字。例如,请参阅静态与动态多态性。

      • 那么概念显然并不比模板已经更像鸭式了

      • 这里的另一个论点是鸭子类型通常假设您通过尝试使用类型来表达类型约束。与模板相比,概念与此模型的距离更远。

    2. 如果我们(错误地)同意链接问题的已接受答案和维基百科,那么

      • 模板不是鸭子类型(示例)的原因是它们发生在编译时

      • 概念也发生在编译时

      • QED

    概念采用模板已经所做的(可能是也可能不是,但绝对是鸭子类型)并提供更细粒度的专业化选项,和/或更清晰地表达类型约束,以及(希望)有助于产生更好的错误。

    在所有这些操作下,duckiness 的质量是不变的。

    【讨论】:

    • "这里的另一个论点是,duck typing 通常假设您通过尝试使用类型来表达您的类型约束。概念比模板已经离这个模型更远。"到目前为止,这对我来说似乎是“正确”的答案。绝对不是我从阅读规范中拿走的一点,但现在你已经说过了。
    • 我倾向于认为概念更像是 Haskell 的类型类:它们用于制作明确的东西,否则只会隐含
    【解决方案2】:

    这完全取决于你如何定义“鸭子打字”。

    如果你使用dictionary definition(“如果它走路像鸭子,叫起来像鸭子,那么它一定是鸭子”),那么前置概念templates are a form of duck typing

    templates are not duck typing 的论点本质上是该术语常用方式的论点:据说使用“鸭子类型”的语言(Python、Lua 等)完成了大部分/全部验证鸭子是实际上是运行时的鸭子。模板在编译时执行其等效操作,因此它们不代表鸭子类型。

    请注意,概念不会影响这些解释中的任何一种。如果您认为运行时检查是“鸭式打字”本质的基本组成部分,那么即使有概念,模板也不是鸭式打字。

    因此,如果您认为模板是鸭式输入前概念,那么您可能会以同样的方式感受后概念。反之亦然。

    【讨论】:

    • 所以,模板 = 编译时鸭子类型 :-)
    猜你喜欢
    • 2011-10-18
    • 2011-09-28
    • 2011-03-28
    • 2016-03-15
    • 2012-07-15
    • 1970-01-01
    • 1970-01-01
    • 2018-07-25
    • 1970-01-01
    相关资源
    最近更新 更多