日期:2011-03-22 13:56:00 来源:本站整理
C++/CLR泛型与C++模板之间的比较[VC/C++编程]
本文“C++/CLR泛型与C++模板之间的比较[VC/C++编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
Visual Studio 2005把泛型编程的范例参数模子引入了微软.NET框架组件.C++/CLI支持两种范例参数机制--通用语言运行时(CLR)泛型和C++模板.本文将介绍二者之间的一些辨别--分外是参数列表和范例约束模子之间的辨别.
参数列表又回来了
参数列表与函数的信号(signature)近似:它标明了参数的数目和每个参数的范例,并把给每个参数关联一个唯一的标识符,这样在模板定义的内部,每个参数便可以被唯一地引用.
参数在模板或泛型的定义中起占位符(placeholder)的作用.用户通过供应绑定到参数的实际值来成立对象实例.参数化范例的实例化并非简单的文本替换(宏扩大机制就是利用文本替换的).相反地,它把实际的用户值绑定到定义中的相关的情势参数上.
在泛型中,每个参数都表现为Object范例或衍生自Object的范例.在本文背面你可以看到,这约束了你大概履行的操作范例或通过范例参数声明的对象.你可以通过供应越发明确的约束来调整这些约束关系.这些明确的约束引用那些衍生出实际范例参数的基类或接口调集.
模板除了支持范例参数之外,还支持表达式和模板参数.此外,模板还支持默许的参数值.这些都是按照位置而不是名称来分化的.在两种机制之下,范例参数都是与类或范例名称关键字一同引入的.
参数列表的额外的模板功效
模板作为范例参数的增补,答应两种范例的参数:非范例(non-type)参数和模板参数.我们将辨别简短地介绍一下.
非范例参数受常数表达式的约束.我们应当当即想到它是数值型或字符串常量.比方,假如挑选供应固定大小的仓库,你便大概同时指定一个非范例的大小参数和元素范例参数,这样便可以同时按照元素类别和大小来划分仓库实例的类别.比方,你可以在代码1中看到带有非范例参数的固定大小的仓库.
代码1:带有非范例固定大小的仓库
template <class elemType, int size> public ref class tStack { array<elemType> ^m_stack; int top; public: tStack() : top( 0 ) { m_stack = gcnew array<elemType>( size ); } }; |
此外,假如模板类计划者可认为每个参数指定默许值,利用起来便大概便利多了.比方,把缓冲区的默许大小设置为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++尺度:
// ISO-C++名字空间std中的默许范例参数值示例 { template <class T, class Container = deque<T> > class queue; template <class T, class Allocator = allocator<T> > class vector; // ... } |
你可以供应默许的元素范例,以下所示:
// 带有默许的元素范例的模板声明
template <class elemType=String^, int size=1024>
public ref class tStack {};
从计划的角度来说很难证明它的精确性,因为普通来说容器不堆积合在在单个默许范例上.
指针也可以作为非范例参数,因为对象或函数的地址在编译时就已知了,因此是一个常量表达式.比方,你大概但愿为仓库类供应第三个参数,这个参数指明碰到特定条件的时刻利用的回调处理程序.明智地利用typedef可以大幅度简化那些表面上看起来很复杂的声明,以下所示:
typedef void (*handler)( ... array<Object^>^ ); template <class elemType, int size, handler cback > public ref class tStack {}; |
当然,你可认为处理程序供应默许值--在这个例子中,是一个已有的办法的地址.比方,下面的缓冲区声明就供应了大小和处理程序:
void defaultHandler( ... array<Object^>^ ){ ... } template < class elemType, int size = 1024, handler cback = &defaultHandler > public ref class tStack {}; |
由于默许值的位置次序优先于命名次序,因此假如不供应明确的大小值(即便这个大小与默许值是反复的),就无法供应重载的处理程序的.下面就是大概用到的改正仓库的办法:
void demonstration() { // 默许的大小和处理程序 tStack<String^> ^ts1 = nullptr; // 默许的处理程序 tStack<String^, 128> ^ts2 = gcnew tStack<String^, 128>; // 重载全部的三个参数 tStack<String^, 512, &yourHandler> ^ts3; } |
模板支持的第二种额外的参数就是template模板参数--也就是这个模板参数本身表现为一个模板.比方:
// template模板参数 template <template <class T> class arena, class arenaType> class Editor { arena<arenaType> m_arena; // ... }; |
Editor模板类列出了两个模板参数arena和arenaType.ArenaType是一个模板范例参数;你可以传送整型、字符串型、自定义范例等等.Arena是一个template模板参数.带有单个模板范例参数的任何模板类都可以绑定到arena.m_arena是一个绑定到arenaType模板范例参数的模板类实例.比方:
// 模板缓冲区类 template <class elemType> public ref class tBuffer {}; void f() { Editor<tBuffer,String^> ^textEditor; Editor<tBuffer,char> ^blitEditor; // ... } |
以上是“C++/CLR泛型与C++模板之间的比较[VC/C++编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |
评论内容只代表网友观点,与本站立场无关!
评论摘要(共 0 条,得分 0 分,平均 0 分)
查看完整评论