在VC++中,__uuidof是一个扩展操作符用于取得组件或接口的uuid,在COM编程中经常用到。那么在其它编译器中我们如何实现这个很有用的功能呢?方法也许不只一种,这介绍用type traits的方式来实现,为了简单起见,并不使用GUID结构来表示uuid以省去GUID的定义和其繁琐的初始化操作,这里用一个字符串来表示一个类的uuid,有点类似于COM编程中的ProgID(Programme ID,编程ID,COM编程中指表示接口或组件的容易记忆的名字,以下uuid都是指这个ID)首先来定义一个模板类来存储uuid
这个类没有任何实现,uuid数据将存储于其特化版本,看以下的代码
现在我们可以通过 _UuidTraits<TheClass>::uuid 来取类ClassA的uuid来,方便使用我们定义一个宏#define __uuidof(x) (_UuidTraits<x>::uuid)但这样只实现了ClassA的uuid,如果为每个类都写一个_UuidTraits的特化版本有点累,但我们可以用宏来简化
这样我们就可以方便的为类定义uuid了,比如:
OK,现在试试__uuidof(ClassB),应该返回字符串"ClassB"了。还有一点要说明的是,为了能兼容UNICODE,可以定义两个版本的DEFINE_UUID:
这样在使用UNICODE字符编码编译时,__uuidof返回的就是unicode字符串了
posted on 2008-01-21 21:29 深蓝色系统 阅读(355) 评论(0) 编辑 收藏 引用 所属分类: 皮皮片片