可能重复: C#和…中泛型的区别是什么?C++中的模板呢?
与C#模板相比,C++泛型有什么不同?据我所知,它们并不能解决完全相同的问题,所以两者的利弊是什么?
发布于 2009-07-30 17:49:56
您可以将C++模板看作是一种伪装成泛型系统的解释的函数式编程语言。如果这没有吓到你,它应该:)
C#泛型是非常有限的;您可以将一个或多个类型上的类参数化,并在方法中使用这些类型。因此,以MSDN为例,您可以这样做:
public class Stack<T>
{
T[] m_Items;
public void Push(T item)
{...}
public T Pop()
{...}
}
现在您可以声明一个Stack<int>
或Stack<SomeObject>
,它将安全地存储该类型的对象(即,不必担心错误地将SomeOtherObject
放入其中)。
在内部,.NET运行时将其专门化为基本类型(如int )的变体,以及对象类型的变体。例如,这允许Stack<byte>
的表示比Stack<SomeObject>
的小得多。
C++模板允许类似的使用:
template<typename T>
class Stack
{
T *m_Items;
public void Push(const T &item)
{...}
public T Pop()
{...}
};
乍一看,这看起来很相似,但有几个重要的区别。首先,不是每个基本类型有一个变体,所有对象类型都有一个变体,而是为每个类型实例化了一个变体。那可能是很多类型的!
下一个主要的区别是(在大多数C++编译器上)它将在它所使用的每个翻译单元中编译。这会使编译速度减慢很多。
C++模板的另一个有趣的属性是它们可以应用于类以外的东西--当它们被应用到类时,它们的参数可以被自动检测出来。例如:
template<typename T>
T min(const T &a, const T &b) {
return a > b ? b : a;
}
类型T将由函数在其中使用的上下文自动确定。
这些属性可以用于良好的目的,而牺牲你的理智。因为C++模板是针对其使用的每一种类型重新编译的,而且编译器总是可以使用模板的实现,所以C++可以在模板上进行非常积极的内联。再加上函数中模板值的自动检测,您可以使用匿名伪函数在C++中使用助推:lambda。因此,一个类似于:
_1 + _2 + _3
生成一个具有严重可怕类型的对象,该对象有一个运算符(),它将其参数加在一起。
C++模板系统还有很多其他的黑暗角落--它是一个非常强大的工具,但考虑起来可能会很痛苦,有时也很难使用--特别是当它给你一个长达20页的错误信息时。C#系统要简单得多--不那么强大,但更容易理解,更难以滥用。
发布于 2009-07-30 17:44:40
http://blogs.msdn.com/csharpfaq/archive/2004/03/12/88913.aspx
大致上,差异很大程度上是因为模板在编译时被解析,泛型在运行时被解析。
发布于 2009-07-30 17:46:30
关于堆栈溢出的广泛答案:C#和Java中的泛型有什么区别?C++中的模板呢?
https://stackoverflow.com/questions/1208153
复制相似问题