Posted on 2006-02-05 04:40
Tommy Liang 閱讀(1444)
評論(1) 編輯 收藏 引用 所屬分類:
泛型編程與設計模式
就是這樣一個結構:
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”方法,那么怎么辦呢,函數是不能偏特化的,即如下代碼:
在 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>());
關鍵是,這個東西也是給編譯器看的,妙