Geo*_*rge 11 c++ parametric-polymorphism
根据参数多态性的维基百科页面:
类型多态的一些实现在表面上类似于参数多态,同时还引入了特殊方面.一个例子是C++模板专业化.
问题:为什么C++只表示实现与paramaterized多态相似的表面形式?特别是,模板不是完全参数多态的一个例子吗?
为什么说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;
}
Run Code Online (Sandbox Code Playgroud)
在编译期间,这将产生两个函数: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#)会更好。