Chinaunix

标题: C++ 模板和 C# 泛型之间的区别(C# 编程指南) [打印本页]

作者: keehoo    时间: 2011-12-20 12:26
标题: C++ 模板和 C# 泛型之间的区别(C# 编程指南)
Visual Studio 2005 其他版本  Visual Studio 2010
Visual Studio 2008

C# 泛型和 C++ 模板都是用于提供参数化类型支持的语言功能。然而,这两者之间存在许多差异。在语法层面上,C# 泛型是实现参数化类型的更简单方法,不具有 C++ 模板的复杂性。此外,C# 并不尝试提供 C++ 模板所提供的所有功能。在实现层面,主要区别在于,C# 泛型类型替换是在运行时执行的,从而为实例化的对象保留了泛型类型信息。有关更多信息,请参见运行库中的泛型(C# 编程指南)。

以下是 C# 泛型和 C++ 模板之间的主要差异:

C# 泛型未提供与 C++ 模板相同程度的灵活性。例如,尽管在 C# 泛型类中可以调用用户定义的运算符,但不能调用算术运算符。

C# 不允许非类型模板参数,如 template C<int i> {}。

C# 不支持显式专用化,即特定类型的模板的自定义实现。

C# 不支持部分专用化:类型参数子集的自定义实现。

C# 不允许将类型参数用作泛型类型的基类。

C# 不允许类型参数具有默认类型。

在 C# 中,尽管构造类型可用作泛型,但泛型类型参数自身不能是泛型。C++ 确实允许模板参数。

C++ 允许那些可能并非对模板中的所有类型参数都有效的代码,然后将检查该代码中是否有用作类型参数的特定类型。C# 要求相应地编写类中的代码,使之能够使用任何满足约束的类型。例如,可以在 C++ 中编写对类型参数的对象使用算术运算符 + 和 - 的函数,这会在使用不支持这些运算符的类型来实例化模板时产生错误。C# 不允许这样;唯一允许的语言构造是那些可从约束推导出来的构造。

转载自:http://msdn.microsoft.com/zh-cn/library/c6cyy67b(v=VS.80).aspx
作者: truekbcl    时间: 2011-12-20 16:36
给蚂蚁取名叫大象,以为就有了大象的能力。
c#java的泛型就不要和c++比较了,没任何意义。
作者: 狗蛋    时间: 2011-12-20 16:53
比python中的模板差太远了。

python默认一切都是模板,连尖括号都不用,也没有任何限制,爱搞什么搞什么,真执行到了,再临时字符串搜索被调用的方法。
作者: noword2k    时间: 2011-12-21 10:16
狗蛋 发表于 2011-12-20 16:53
比python中的模板差太远了。

python默认一切都是模板,连尖括号都不用,也没有任何限制,爱搞什么搞什么 ...

所以python才慢的象蜗牛啊。
作者: 狗蛋    时间: 2011-12-21 11:06
noword2k 发表于 2011-12-21 10:16
所以python才慢的象蜗牛啊。

没错。不过好像你还不明白,我和2楼都是在吐槽把这种运行期确定类型称为“泛型”、并大言不惭地和C++的泛型相提并论的骗子啊。
作者: asuka2001    时间: 2011-12-21 11:09
。。。。动态语言和静态语言没有可比性吧,毕竟是解决不同问题的。
作者: KanonInD    时间: 2011-12-21 11:51
本帖最后由 KanonInD 于 2011-12-21 11:59 编辑

对于静态语言,支持“类型推导”的话,模板和范型就好办了。
http://zh.wikipedia.org/zh/%E7%B1%BB%E5%9E%8B%E6%8E%A8%E8%AE%BA
http://en.wikipedia.org/wiki/Type_inference
http://en.wikipedia.org/wiki/Parametric_polymorphism




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2