C# 泛型与 C++ 模板的比较

标签 c# c++ generics templates comparison

<分区>

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/

相关文章:

c++ - 诺基亚 Qt 中的进度条?

c++ - GLSDK - 无法执行示例 OpenGL 程序

c# - 有没有一种在不知道 T 的情况下清除 ICollection<T> 的好方法?

java - Jackson 通用类型引用 + enableDefaultTyping 问题

时间:2019-03-17 标签:c#javascriptinbrowser

c# - 如何修剪 List<string> 以便删除前后的空行?

c# - 如何使用 LINQ 将日期与毫秒进行比较

C++:简单递归搜索函数的运行时错误

c# - Reflection GetValue 给出一个 TargetException(非静态方法需要一个目标)

scala - 伴随对象的继承