【问题标题】:Why is C++ said not to support parametric polymorphism?为什么说 C++ 不支持参数多态?
【发布时间】:2016-04-29 22:09:09
【问题描述】:

根据Parametric Polymorphism 的维基百科页面:

类型多态的一些实现表面上类似于参数多态,同时也引入了特殊方面。一个例子是 C++ 模板特化。

问题:为什么说 C++ 只实现与参数化多态性表面上相似的东西?特别是,模板不是完全参数多态的一个例子吗?

【问题讨论】:

  • 不管这个问题的答案如何,维基百科页面需要很多爱......
  • 该 wiki 页面来自理论的观点 - 类型论的严格数学规范,因此,术语“参数多态性”具有严格的定义。 C++ 模板比任何此类理论能够/将提供的更……灵活……。因此......也许更有用!当然更有趣!无论如何,我一直听说 C++ 模板被描述为“临时多态性”。

标签: c++ parametric-polymorphism


【解决方案1】:

您链接到的文章解释了这一点。您引用的文本实际上给出了一个将 C++ 模板与纯参数多态性区分开来的示例:C++ 模板专业化。

继续这个主题:

继 Christopher Strachey 之后,[2] 参数多态性可能与 ad hoc polymorphism 形成对比,其中单个多态函数可以具有许多不同且可能异构的实现,具体取决于参数的类型( s) 应用它。因此,ad hoc 多态性通常只能支持有限数量的此类不同类型,因为必须为每种类型提供单独的实现。

因此,如上所述,C++ 模板接近——但不完全是——参数多态性。

【讨论】:

    【解决方案2】:

    为什么说 C++ 只实现表面上类似于参数化多态性的东西?特别是,模板不是完全参数多态的一个例子吗?

    C++ 中的模板函数基于参数的“替换”工作。这实质上意味着编译器会生成另一个版本的函数,其中模板参数被硬编码到函数中。

    假设你在 C++ 中有这个:

    template <typename T>
    T add(T a, T b) {
        return a + b;
    }
    
    int main() {
        int i = add(2, 3);
        double d = add(2.7, 3.8);
        return i + (int)d;
    }
    

    在编译期间,这将产生两个函数:int add(int a, int b) { return a + b; }double add(double a, double b) { return a + b; } 一个函数将只处理整数,而另一个将只处理双精度数。没有多态性。

    实际上,您最终会得到与参数变体数量一样多的实现。

    但为什么这不是参数多态性?”你可能会问?

    您需要“add”函数的完整源代码,以便使用您自己的特定变体来调用它,该变体会重载二进制“+”运算符! - 这就是 与众不同的细节。

    如果 C++ 具有适当的参数多态性,例如 C#,您最终编译的“add”实现将包含足够的逻辑,以便在运行时确定对于“add”可接受的任何给定参数的“+”重载。而且你不需要那个函数的源代码,就可以用你发明的新类型来调用它。

    这在现实中意味着什么?

    但不要将其理解为 C++ 不那么强大或 C# 更强大。这只是众多语言功能细节之一。

    如果您拥有可用于模板化函数的完整源代码,那么 C++ 的语义要优越得多。如果您只有一个静态或动态库可供使用,那么参数多态实现(例如 C#)会更好。

    【讨论】:

    • 我不同意。它仍然是一个多态性:它具有相同的名称和不同的内部形式。那就是多态性的翻译。无论是在编译时还是在运行时完成都无关紧要。
    猜你喜欢
    • 2021-11-06
    • 2010-11-15
    • 2018-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-13
    相关资源
    最近更新 更多