注册通行证 用户名 密码
  • 文章投稿
  • 博客
  • 论坛
  • 设为首页
  • 加入收藏
jztop.com网络技术
  • 首页
  • | iT新闻
  • | 操作系统
  • | 组网建网
  • | 网络安全
  • | 程序开发
  • | 办公一族
  • | 工具软件
  • | 网页制作
  • | 多媒体制作
  • | 网吧技术
  • | 服务器
  • | 专题教程
Vista | 软件评测 | 系统备份 | 优化 | 进程 | 聊天 | 病毒 | Linux | 黑客 | 防火墙 | 数据库 | Web开发 | Java | Word | 游戏 | 32位开发 | 移动开发
当前位置:首页 > 程序开发 > 32位开发 > C/C++ 内容正文:C++/CLR泛型与C++模板的对比

C++/CLR泛型与C++模板的对比

发布时间:2006-05-05 19:02:15 来源:天极网 网友评论 0 条

  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++/CLI思辨录之Object的对象布局
  • C语言:超越C++下一代C++ —C++/CLI简介
  • C++/CLI中实现singleton模式
【评论】【收藏本文】【打印】【关闭】
上一篇文章:VC中借助DirectDraw实现水波的模拟
下一篇文章:C++编写的ATM自动取款机模拟程序分析
讨论区
查看
已有 0 位对此新闻感兴趣的网友发表了看法
匿名发表
注册通行证 登陆
图文阅读推荐
推荐阅讯
  • 基于Visual C++的Winsock API研究
  • C++启蒙之注释符号
  • More Effective C++:不要重载的操作符
  • C++中要求(或禁止)对象产生于heap中
  • VC++编程实现对波形数据的频谱分析
  • 了解C++异常处理的系统开支
  • 四种程序启动画面的制作方法(VC)
  • VC编程中如何操作数据库中的图像字段
  • Windows Sockets:背景知识
  • VC中利用人工智能解决八迷宫问题
阅读排行
  • 1.Borland 发布C++ Builder 2006 RAD 环境
  • 2.C/C++程序员应聘常见面试题深入剖析
  • 3.Visual C++常用数据类型转换详解
  • 4.C++中的 static 关键字
  • 5.利用VC++实现局域网实时视频传输
  • 6.浅谈C/C++内存泄漏及其检测工具
  • 7.英国投票否决C++/CLI 微软强攻ISO标准受挫
  • 8.VC++下用MSComm控件实现串口通讯
  • 9.伪随机数生成及在VC++中的实现
  • 10.VC++编程实现对波形数据的频谱分析
专题教程
  • 大话G游 专题:手机病毒揭密
  • ARP攻击防范与解决方案 路由故障处理手册
  • Picasa中文版_Picasa教程 专题:清除流氓软件
  • Firefox专题 seo搜索引擎优化专区
  • 重装Windows必知的事情 装机之必备软件大行动
病毒专杀栏
  • 杀毒软件反被病毒杀 连"救命"都不能喊
  • 金山ARP防火墙
  • 还原卡神话破灭“机器狗”病毒来势汹汹
  • cctv经济半小时:你的手机现在安全吗?
  • 新挂马方式开始流行 ARP挂马称雄局域网
  • 木马和病毒清除的通用解法
  • IP地址不再冲突 查找ARP攻击者元凶
  • 教你几招识别和防御Web网页木马
  • 分析:封杀BT只是暂时的止痛药
  • QQ爆危险漏洞,“QQ游戏邀请大盗”邀请你玩病
关于我们 | 诚聘英才 | 联系我们 | 版权声明 | 网站大事 | 网站地图 | 意见建议
CopyRight 2005-2007 Jztop.Com 版权所有 未经许可 请勿转载