型别对型别的映射(Type2Type)

就是这样一个结构:

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

 

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值