可能是重复问题:
C#和Java中的泛型与C ++中的模板有什么区别?
C#泛型与C ++模板有哪些区别?我知道它们并不完全解决同样的问题,那么两者的优缺点是什么?
可能是重复问题:
C#和Java中的泛型与C ++中的模板有什么区别?
C#泛型与C ++模板有哪些区别?我知道它们并不完全解决同样的问题,那么两者的优缺点是什么?
public class Stack<T>
{
T[] m_Items;
public void Push(T item)
{...}
public T Pop()
{...}
}
Stack<int>
或Stack<SomeObject>
,它将安全地存储该类型的对象(即,不用担心错误地放入SomeOtherObject
)。Stack<byte>
的表示比Stack<SomeObject>
小得多。template<typename T>
class Stack
{
T *m_Items;
public void Push(const T &item)
{...}
public T Pop()
{...}
};
template<typename T>
T min(const T &a, const T &b) {
return a > b ? b : a;
}
类型T将自动由函数使用的上下文确定。
这些属性可以用于好的目的,但会牺牲您的理智。因为C++模板每使用一种类型就重新编译一次,并且模板的实现始终可供编译器使用,所以C++可以对模板进行非常激进的内联处理。再加上在函数中自动检测模板值的功能,您可以使用boost::lambda在C++中创建匿名伪函数。因此,像这样的表达式:
_1 + _2 + _3
生成一个非常可怕的类型对象,该对象具有一个operator(),它将其参数相加。
C++模板系统还有许多其他黑暗角落-它是一种非常强大的工具,但思考起来可能很痛苦,有时很难使用-特别是当它给您提供了长达二十页的错误消息。 C#系统要简单得多-功能较弱,但更易于理解和难以滥用。
T SomeFunc<T>(T input){...}
)是相同的吗? - dotNEThttp://blogs.msdn.com/csharpfaq/archive/2004/03/12/88913.aspx
粗略地讲,模板是在编译时解析的,而泛型是在运行时解析的。List<int>
实现,而不是使用等效于List<object>
的通用类型擦除版本(这是它与Java不同的一种方式)。 - Daniel EarwickerStack Overflow上的详细回答:C#和Java中的泛型有什么区别...以及C ++中的模板?