Posted on 2006-02-06 01:11
Tommy Liang 閱讀(468)
評論(0) 編輯 收藏 引用 所屬分類:
泛型編程與設計模式
在編譯時刻,在Conversion類中產生兩個常數(編譯器幫忙計算)
template <class T,class U>
class Conversion


{
//
public:

enum
{ exists2Way = exists && Conversion<U,T>::exists };

enum
{ sameType = false };
};一個是 exists2Way,表示是否可以兩個類型互相轉換,
sameType 表示 T和U是否同一個類型。
不過,雖然書里這么說,我怎么都搞不懂為什么這樣可以,測試也是不對的,難道這個sameType的寫法還有別的奧妙?
不過下面這個偏特的寫法倒是比較容易理解:
template <class T>
class Conversion<T,T>


{
public:

enum
{ exists = 1,exists2Way = 1,sameType = 1 };
};這個測試是OK的。
有了這幾個常數,要決定兩個class之間是否存在繼承關系就比較容易了:
#define SUPERSUBCLASS(T,U) \
(Conversion<const U*, const T*>::exists && \
!Conversion<const T*, const void*>::sameType)如果U是public繼承自T,或者T和U是同一個類,那么SUPERSUBCLASS(T,U)傳回true,這里是把某個class視為自己的超類,更嚴謹的做法是:
#define SUPERSUBCLASS_STRICT(T,U) \
(SUPERSUBCLASS(T,U) && \
!Conversion<const T, const U>::sameType)即排除T與U是同一個類型的情況。
另外,加上 const 是為了 防止因為 const 而導致轉型失敗,對于已經是const的東西再const一次的話后面一次的const會忽略掉。
再,這個宏的名字很清晰,就是 超類--子類, 前面那個T是超類,U是子類,這個命名比 INHERITS要好。