我一再听说C#中的泛型不如C ++中的模板强大。但我没有听到任何支持(或反对)此论点的论点。是真的如此,如果是这样,它显示的是什么?
我最近遇到了一个奇怪的功能:如果SomeClassChild
是类SomeClass
的后代,则List<SomeClassChild>
无法转换为List<SomeClass>
,而SomeClassChild[]
到SomeClass[]
- 可以。
以下代码也会导致错误:
List<SomeClass> lst = new List<SomeClass>();
lst.Add(new SomeClassChild());
答案 0 :(得分:4)
“C#in depth”一书中,它有一个关于比较语言之间泛型的主题。作为C ++ / C#,我只是从书中复制一些内容:
C ++编译器非常智能,只能为任何给定的集合编译一次代码 模板参数,但它不能以CLR的方式共享代码 参考类型。缺乏共享确实有其好处,但它允许特定于类型的优化,例如内联方法调用某些类型参数但不 其他人,来自同一个模板。它还意味着可以为每组类型参数单独执行重载决策,而不是仅仅基于一次 由于存在任何约束,C#编译器的知识有限。
C ++模板相对于C#泛型的一个重要特性是模板参数不必是类型名称。变量名,函数名和 也可以使用常量表达式。一个常见的例子是缓冲类型 具有缓冲区大小作为模板参数之一 - 缓冲区 将始终是20个整数的缓冲区,缓冲区将始终是一个缓冲区 35个双打。这种能力对于模板元编程至关重要(参见维基百科 article,http://en.wikipedia.org/wiki/Template_metaprogramming),这是一个 先进的C ++技术,这个想法让我感到害怕,但这可能是强大的 专家之手。
C ++模板在其他方面也更灵活。他们没有遭受缺乏 运算符约束和其他一些限制 在C ++中不存在:您可以从其中一个类型参数派生出一个类 可以为特定的一组类型参数专门化一个模板。后者的能力允许 模板作者编写在没有更多知识时使用的通用代码 可用的,特定类型的特定(通常是高度优化的)代码。
如果您想了解更多信息,请查看该书。