tommy

It's hard to tell the world we live in is either a reality or a dream
posts - 52, comments - 17, trackbacks - 0, articles - 0
  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

就是这样一个结构:

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>());

 

关键是,这个东西也是给编译器看的,妙

Feedback

# re: 读书笔记《C++设计新思维》(3) Type2Type的意义   回复  更多评论   

2013-02-04 15:23 by kaso
这2个有什么不同呢。
开销估计也差不多。
我觉得2者可能的不同还是在可扩展性上面。

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理