11

根据参数多态性的维基百科页面:

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

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

4

2 回答 2

2

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

它继续这个主题:

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

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

于 2016-04-29T23:47:22.613 回答
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; } 另一个只处理双精度数。没有多态性。

所以真的,你最终得到的实现与参数变化的数量一样多。

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

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

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

这在现实中意味着什么?

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

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

于 2016-04-30T01:29:09.730 回答