Type traits簡單應用:__uuidof的模擬
在VC++中,__uuidof是一個擴展操作符用于取得組件或接口的uuid,在COM編程中經常用到。那么在其它編譯器中我們如何實現這個很有用的功能呢?
方法也許不只一種,這介紹用type traits的方式來實現,為了簡單起見,并不使用GUID結構來表示uuid以省去GUID的定義和其繁瑣的初始化操作,這里用一個字符串來表示一個類的uuid,有點類似于COM編程中的ProgID(Programme ID,編程ID,COM編程中指表示接口或組件的容易記憶的名字,以下uuid都是指這個ID)
首先來定義一個模板類來存儲uuid
template<typename T>
struct _UuidTraits

{
};
這個類沒有任何實現,uuid數據將存儲于其特化版本,看以下的代碼
class ClassA;
template<>
_UuidTraits<ClassA>

{
static const char * uuid = "ClassA";
};
class ClassA

{
//any code of ClassA
};
現在我們可以通過 _UuidTraits<TheClass>::uuid 來取類ClassA的uuid來,方便使用我們定義一個宏
#define __uuidof(x) (_UuidTraits<x>::uuid)
但這樣只實現了ClassA的uuid,如果為每個類都寫一個_UuidTraits的特化版本有點累,但我們可以用宏來簡化
#define DEFINE_UUID(x, uuidofx) \
class x; \
template<> \
_UuidTraits<x> \

{ \
static const char * uuid = #uuidofx; \
}; \
這樣我們就可以方便的為類定義uuid了,比如:
DEFINE_UUID(ClassB, ClassB)
class ClassB

{
//any code of ClassB
};
OK,現在試試__uuidof(ClassB),應該返回字符串"ClassB"了。
還有一點要說明的是,為了能兼容UNICODE,可以定義兩個版本的DEFINE_UUID:
#ifdef UNICODE
#define DEFINE_UUID(x, uuidofx) \
class x; \
template<> \
_UuidTraits<x> \

{ \
static const wchar_t * uuid = L#uuidofx; \
}; \
#else
#define DEFINE_UUID(x, uuidofx) \
class x; \
template<> \
_UuidTraits<x> \

{ \
static const char * uuid = #uuidofx; \
}; \
#endif
這樣在使用UNICODE字符編碼編譯時,__uuidof返回的就是unicode字符串了
posted on 2008-01-21 21:29 深藍色系統 閱讀(375) 評論(0) 編輯 收藏 引用 所屬分類: 皮皮片片

