C++/CLR泛型与C++模板之间的对比
作者 佚名技术
来源 程序设计
浏览
发布时间 2012-06-30
Visual Studio 2005把泛型编程的类型参数模型引入了微软.NET框架组件。C++/CLI支持两种类型参数机制--通用语言运行时(CLR)泛型和C++模板。本文将介绍两者之间的一些区别--特别是参数列表和类型约束模型之间的区别。 参数列表又回来了 参数列表与函数的信号(signature)类似:它标明了参数的数量和每个参数的类型,并把给每个参数关联一个唯一的标识符,这样在模板定义的内部,每个参数就可以被唯一地引用。 参数在模板或泛型的定义中起占位符(placeholder)的作用。用户通过提供绑定到参数的实际值来建立对象实例。参数化类型的实例化并非简单的文本替代(宏扩展机制就是使用文本替代的)。相反地,它把实际的用户值绑定到定义中的相关的形式参数上。 在泛型中,每个参数都表现为Object类型或衍生自Object的类型。在本文后面你可以看到,这约束了你可能执行的操作类型或通过类型参数声明的对象。你可以通过提供更加明确的约束来调整这些约束关系。这些明确的约束引用那些衍生出实际类型参数的基类或接口集合。 模板除了支持类型参数之外,还支持表达式和模板参数。此外,模板还支持默认的参数值。这些都是按照位置而不是名称来分解的。在两种机制之下,类型参数都是与类或类型名称关键字一起引入的。 参数列表的额外的模板功能 模板作为类型参数的补充,允许两种类型的参数:非类型(non-type)参数和模板参数。我们将分别简短地介绍一下。 非类型参数受常数表达式的约束。我们应该立即想到它是数值型或字符串常量。例如,如果选择提供固定大小的堆栈,你就可能同时指定一个非类型的大小参数和元素类型参数,这样就可以同时按照元素类别和大小来划分堆栈实例的类别。例如,你可以在代码1中看到带有非类型参数的固定大小的堆栈。 代码1:带有非类型固定大小的堆栈
此外,如果模板类设计者可以为每个参数指定默认值,使用起来就可能方便多了。例如,把缓冲区的默认大小设置为1KB就是很好的。在模板机制下,可以给参数提供默认值,如下所示: // 带有默认值的模板声明 template <class elemType, int size = 1024> public ref class FixedSizeStack {}; 用户可以通过提供明确的第二个值来重载默认大小值: // 最多128个字符串实例的堆栈 FixedSizeState<String^, 128> ^tbs = gcnew FixedSizeStack<String^, 128>; 否则,由于没有提供第二个参数,它使用了相关的默认值,如下所示: // 最多1024个字符串实例的堆栈 FixedSizeStack<String^> ^tbs = gcnew FixedSizeStack<String^>; 使用默认的参数值是标准模板库(STL)的一个基本的设计特征。例如,下面的声明就来自ISO-C++标准:
你可以提供默认的元素类型,如下所示: // 带有默认的元素类型的模板声明 template <class elemType=String^, int size=1024> public ref class tStack {}; 从设计的角度来说很难证明它的正确性,因为一般来说容器不会集中在在单个默认类型上。 |
||
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |
你可能对下面的文章感兴趣
上一篇: C++语言基础-字符数组下一篇: C++语言基础-字串操作函数
关于C++/CLR泛型与C++模板之间的对比的所有评论