2016-04-29 70 views
10

据为Parametric Polymorphism维基百科页面:为什么C++表示不支持参数多态?

型的多态性的一些实施表面上类似于参数多态同时还推出特设方面。一个例子是C++模板专业化。

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

+0

不管这个问题的答案,那个维基百科页面需要很多的爱... – Barry

+1

这个维基页面来自理论的角度 - 严谨的数学规范的类型理论,因此,术语“参数多态性“有一个严格的定义。 C++模板比任何这样的理论都能提供的更灵活...。因此......也许更有用!当然更多_有趣!无论如何,我一直听说C++模板被描述为“ad hoc多态性”。 – davidbak

回答

1

为什么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#)会更好。

1

您链接的文章解释了这一点。你所引用的文本实际上给出了一个例子,它将C++的模板从纯粹的参数多态性中分离出来:C++模板特化。

它继续了这一主题:

继克里斯托弗斯特雷奇,[2]参数多态性可与ad hoc polymorphism,其中单个多态函数可以具有取决于多个不同的和潜在的异质实现的对比对其适用的论点类型进行分析。因此,ad hoc多态性通常只能支持有限数量的这种不同类型,因为必须为每种类型提供单独的实现。

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