首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C#泛型与C++模板的比较

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

Stack Overflow用户
提问于 2009-07-30 17:38:44
回答 5查看 13.3K关注 0票数 19

可能重复: C#和…中泛型的区别是什么?C++中的模板呢?

与C#模板相比,C++泛型有什么不同?据我所知,它们并不能解决完全相同的问题,所以两者的利弊是什么?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2009-07-30 17:49:56

您可以将C++模板看作是一种伪装成泛型系统的解释的函数式编程语言。如果这没有吓到你,它应该:)

C#泛型是非常有限的;您可以将一个或多个类型上的类参数化,并在方法中使用这些类型。因此,以MSDN为例,您可以这样做:

代码语言:javascript
运行
复制
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++模板允许类似的使用:

代码语言:javascript
运行
复制
template<typename T>
class Stack
{
    T *m_Items;
    public void Push(const T &item)
    {...}
    public T Pop()
    {...}
};

乍一看,这看起来很相似,但有几个重要的区别。首先,不是每个基本类型有一个变体,所有对象类型都有一个变体,而是为每个类型实例化了一个变体。那可能是很多类型的!

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

C++模板的另一个有趣的属性是它们可以应用于类以外的东西--当它们被应用到类时,它们的参数可以被自动检测出来。例如:

代码语言:javascript
运行
复制
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#系统要简单得多--不那么强大,但更容易理解,更难以滥用。

票数 32
EN

Stack Overflow用户

发布于 2009-07-30 17:44:40

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

大致上,差异很大程度上是因为模板在编译时被解析,泛型在运行时被解析。

票数 5
EN

Stack Overflow用户

发布于 2009-07-30 17:46:30

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1208153

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档