首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 计算机考试 > 等级考试 > 复习指导 >

C++基础解析二十六

2008-12-08 
型别对型别的映射

    就是这样一个结构:
  template <typename T>
  struct Type2Type
  {
  typedef T OriginalType;
  };
  假定有个片断如下,创建一个T*
  template <class T,class U>
  T* Create(const U& arg)
  {
  return new T(arg);
  }
  如果对于某个类如“Widget”,其ctor要有两个参数,比如第二个参数必须是-1(对于旧的代码来说,谁知道呢:)),但又不想另外创建一个“CreateWidget”方法,那么怎么办呢,函数是不能偏特化的,即如下代码:
  //错误的代码
  template <class U>
  Widget* Create<Widget,U>(const U& arg)
  {
  return new Widget(arg,-1);
  }在 VC7下会报告:非法使用显式模板参数
  只能使用函数重载,比如:
  template <class T,class U>
  T* Create(const U&arg,T /*虚拟*/)
  {
  return new T(arg);
  }
  template <class U>
  Widget * Create(const U& arg, Widget /*虚拟*/)
  {
  return new Widget(arg,-1);
  }
  这样是可以解决问题,但最大的毛病在于运行时构造了考试.大提示未被使用的对象这个开销(虚拟的Widget参数)。这时 Type2Type 这个咚咚出场了,按照书的说法,这是“一个型别代表物、一个可以让你传给重载函数的轻量级ID”,如下:
  template <class T,class U>
  T* Create(const U& arg,Type2Type<T>)
  {
  return new T(arg);
  }
  template <class U>
  Widget * Create(const U& arg,Type2Type<Widget>)
  {
  return new Widget(arg,-1);
  }
  调用方:
  String *pStr = Create("hello",Type2Type<String>());
  Widget *pW = Create(100,Type2Type<Widget>());



3COME考试频道为您精心整理,希望对您有所帮助,更多信息在http://www.reader8.com/exam/

热点排行