我的玻璃盒子

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 深蓝色系统 阅读(354) 评论(0)  编辑 收藏 引用 所属分类: 皮皮片片


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


导航

<2009年10月>
27282930123
45678910
11121314151617
18192021222324
25262728293031
1234567

统计

常用链接

留言簿(75)

随笔分类

随笔档案

文章分类

文章档案

搜索

最新评论

阅读排行榜

评论排行榜