快速业务通道

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

作者 佚名技术 来源 程序设计 浏览 发布时间 2012-06-30
制受到的一条批评意见是:缺乏用于描述这种类型约束的形式语法(请注意,在参数化类型的原始设计图纸中,Bjarne Stroustrup论述了曾经考虑过提供显式约束语法,但是他对这种语法不太满意,并选择了在那个时候不提供这种机制)。也就是说,在一般情况下,用户在阅读源代码或相关的文档,或者编译自己的代码并阅读随后的编译器错误消息的时候,才能意识到模板有隐含约束。

  如果你必须提供一个与模板不匹配的类型参数该怎么办呢?一方面,我们能做的事情很少。你编写的任何类都有一定的假设,这些假设表现为某些使用方面的约束。很难设计出适合每种情况的类;设计出适合每种情况和每种可能的类型参数的模板类更加困难。

  另一方面,存在大量的模板特性为用户提供了"迂回"空间。例如,类模板成员函数不会绑定到类型参数,直到在代码中使用该函数为止(这个时候才绑定)。因此,如果你使用模板类的时候,没有使用那些使类型参数失效的方法,就不会遇到问题。

  如果这样也不可行,那么还可以提供该方法的一个专门的版本,让它与你的类型参数关联。在这种情况下,你需要提供Demonstration<int>::方法的一个专用的实例,或者,更为普遍的情况是,在提供整数类型参数的时候,提供整个模板类的专门的实现方式。

  一般来说,当你提到参数化类型可以支持多种类型的时候,你一般谈到的是参数化的被动使用--也就是说,主要是类型的存储和检索,而不是积极地操作(处理)它。

  作为模板的设计人员,你必须知道自己的实现对类型参数的隐含约束条件,并且努力去确保这些条件不是多余的。例如,要求类型参数提供等于和小于操作是合理的;但是要求它支持小于或等于或XOR位运算符就不太合理了。你可以通过把这些操作分解到不同的接口中,或者要求额外的、表示函数、委托或函数对象的参数来放松对操作符的依赖性。例如,代码2显示了一个本地C++程序员使用内建的等于操作符实现的搜索方法。

  代码2:不利于模板的搜索实现

template <class elemType, int size=1024>
ref class Container
{
 array<elemType> ^m_buf;
 int next;

 public:
  bool search( elemType et )
  {
   for each ( elemType e in m_buf )
    if ( et == e )
     return true;
    return false;
  }

  Container()
  {
   m_buf = gcnew array<elemType>(size);
   next = 0;
  }

  void add( elemType et )
  {
   if ( next >= size )
    throw gcnew Exception;
    m_buf[ next++ ] = et;
  }

  elemType get( int ix )
  {
   if ( ix < next )
    return m_buf[ ix ];
   throw gcnew Exception;
  }
  // ...
 };

  在这个搜索函数中没有任何错误。但是,它不太利于使用模板,因为类型参数与等于操作符紧密耦合了。更为灵活的方案是提供第二个搜索方法,允许用户传递一个对象来进行比较操作。你可以使用函数成员模板来实现这个功能。函数成员模板提供了一个额外的类型参数。请看一看代码3。

   代码3:使用模板

template <class elemType, int size=1024>
ref class Container
{
 // 其它的都相同 ...
 // 这是一个函数成员模板...
  // 它可以同时引用包含的类参数和自有参数...

 template <class Comparer>
 bool search( elemType et, Comparer comp )
 {
  for each ( elemType e in m_buf )
   if ( comp( et, e ) )
    return true;
 
   return false;
 }
 // ...
};

现在用户可以选择使用哪一个方法来搜索内容了:紧密耦

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多
  • iBATIS 3内的新特性:将iBATIS用作应用程序内的一种持久框架 - 编程入门网
  • Photoshop绘制高光水晶质感水晶苹果
  • Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

    地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

    电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

    《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号