当前位置:七道奇文章资讯编程技术VC/C++编程
日期: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++编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
  • win8 Could not load type System.ServiceModel.Activation.HttpModule 错误办理筹划
  • 利用Javascript实现网页水印(非图片水印)
  • 在Windows7中将U盘用BitLocker加密的操作步骤
  • rs.open和conn.execute辨别
  • 不用注册机破解Photoshop CS5 每次都需求重新输入注册码
  • CSS网页筹划25个实用小本领
  • CSS3教程:利用@font-face实现本性化字体
  • 办理Windows提醒0xc000009内存错误的办法
  • PHP的chm手册打不开怎么办
  • 关于SQL中CTE(公用表表达式)(Common Table Expression)的总结
  • mysql #1062 –Duplicate entry ''1'' for key ''PRIMARY''
  • SQL Server中利用Linkserver衔接Oracle的办法
  • 本文地址: 与您的QQ/BBS好友分享!
    • 好的评价 如果您觉得此文章好,就请您
        0%(0)
    • 差的评价 如果您觉得此文章差,就请您
        0%(0)

    文章评论评论内容只代表网友观点,与本站立场无关!

       评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
    Copyright © 2020-2022 www.xiamiku.com. All Rights Reserved .