<分区>
Possible Duplicate:
What are the differences between Generics in C# and Java… and Templates in C++?
与 C++ 模板相比,C# 泛型有何区别?我知道它们解决的不是完全相同的问题,那么两者的优缺点是什么?
<分区>
Possible Duplicate:
What are the differences between Generics in C# and Java… and Templates in C++?
与 C++ 模板相比,C# 泛型有何区别?我知道它们解决的不是完全相同的问题,那么两者的优缺点是什么?
最佳答案
您可以将 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++ 可以对模板进行非常积极的内联。再加上自动检测函数中的模板值,您可以制作 anonymous pseudo-functions在 C++ 中,使用 boost::lambda .因此,像这样的表达式:
_1 + _2 + _3
生成一个非常可怕类型的对象,它有一个 operator() 来累加它的参数。
C++ 模板系统还有很多其他的阴暗角落——它是一个非常强大的工具,但想想起来会很痛苦,有时甚至难以使用——尤其是当它给你一条长达 20 页的错误消息时。 C# 系统要简单得多 - 功能不那么强大,但更容易理解且更难滥用。
关于C# 泛型与 C++ 模板的比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1208153/