C#generics与C ++模板比较

可能重复:
C#和Java中的generics与C ++中的模板有什么区别?

C#generics与C ++模板之间有什么区别? 我知道他们没有解决完全相同的问题,那么两者的优点和缺点是什么?

您可以将C ++模板视为一种伪装成generics系统的解释型函数式编程语言。 如果这不吓到你,那应该:)

C#generics非常有限; 您可以参数化一个或多个类型的类,并在方法中使用这些类型。 因此,从MSDN中获取示例,您可以:

public class Stack { T[] m_Items; public void Push(T item) {...} public T Pop() {...} } 

现在你可以声明一个StackStack并且它将安全地存储该类型的对象(即,不担心错误地放入SomeOtherObject )。

在内部,.NET运行时将把它专门化为基本类型(如int)的变体,以及对象类型的变体。 例如,这允许Stack的表示远小于Stack表示。

C ++模板允许类似的用途:

 template class Stack { T *m_Items; public void Push(const T &item) {...} public T Pop() {...} }; 

乍一看这看起来很相似,但有一些重要的区别。 首先,代替每个基本类型的一个变体和所有对象类型的变体,对于它实例化的每种类型都有一个变体。 这可能是很多类型!

下一个主要区别是(在大多数C ++编译器上)它将在它使用的每个转换单元中编译。这可以减慢编译速度。

C ++模板的另一个有趣的属性是它们可以应用于除类之外的其他东西 – 当它们存在时,它们的参数可以被自动检测到。 例如:

 template T min(const T &a, const T &b) { return a > b ? b : a; } 

类型T将由使用函数的上下文自动确定。

这些属性可以用来达到目的,牺牲你的理智。 因为C ++模板是针对它所使用的每种类型重新编译的,并且编译器的实现始终可供编译器使用,所以C ++可以对模板进行非常积极的内联。 除此之外,还可以自动检测函数中的模板值,并且可以使用boost :: lambda在C ++中创建匿名伪函数 。 因此,表达式如下:

_1 + _2 + _3

生成一个具有严重可怕类型的对象,该对象具有一个运算符(),该运算符将其参数相加。

C ++模板系统还有很多其他的黑暗角落 – 它是一个非常强大的工具,但是可能会很难思考,有时候很难使用 – 特别是当它给你一个长达20页的错误消息时。 C#系统更简单 – function更强大,但更容易理解,更难以滥用。

http://blogs.msdn.com/csharpfaq/archive/2004/03/12/88913.aspx

粗略地说,大部分差异与模板在编译时解析,并在运行时解析generics有关。

关于Stack Overflow的广泛答案: C#和Java中的Generics与C ++中的模板有什么区别?

Eric Gunnerson的这篇博客文章很好地涵盖了这个主题。

最直接的区别在于模板是编译时function,而generics是运行时function。

这看起来像一个方便的参考。

http://msdn.microsoft.com/en-us/library/c6cyy67b.aspx