• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            我的玻璃盒子

            Type traits簡(jiǎn)單應(yīng)用:__uuidof的模擬

            在VC++中,__uuidof是一個(gè)擴(kuò)展操作符用于取得組件或接口的uuid,在COM編程中經(jīng)常用到。那么在其它編譯器中我們?nèi)绾螌?shí)現(xiàn)這個(gè)很有用的功能呢?
            方法也許不只一種,這介紹用type traits的方式來(lái)實(shí)現(xiàn),為了簡(jiǎn)單起見(jiàn),并不使用GUID結(jié)構(gòu)來(lái)表示uuid以省去GUID的定義和其繁瑣的初始化操作,這里用一個(gè)字符串來(lái)表示一個(gè)類(lèi)的uuid,有點(diǎn)類(lèi)似于COM編程中的ProgID(Programme ID,編程ID,COM編程中指表示接口或組件的容易記憶的名字,以下uuid都是指這個(gè)ID)
            首先來(lái)定義一個(gè)模板類(lèi)來(lái)存儲(chǔ)uuid

            template<typename T>
            struct _UuidTraits
            {
            }
            ;

            這個(gè)類(lèi)沒(méi)有任何實(shí)現(xiàn),uuid數(shù)據(jù)將存儲(chǔ)于其特化版本,看以下的代碼

            class ClassA;
            template
            <>
            _UuidTraits
            <ClassA>
            {
                
            static const char * uuid = "ClassA";
            }
            ;
            class ClassA
            {
                
            //any code of ClassA
            }
            ;


            現(xiàn)在我們可以通過(guò) _UuidTraits<TheClass>::uuid 來(lái)取類(lèi)ClassA的uuid來(lái),方便使用我們定義一個(gè)宏
            #define __uuidof(x) (_UuidTraits<x>::uuid)
            但這樣只實(shí)現(xiàn)了ClassA的uuid,如果為每個(gè)類(lèi)都寫(xiě)一個(gè)_UuidTraits的特化版本有點(diǎn)累,但我們可以用宏來(lái)簡(jiǎn)化

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


            這樣我們就可以方便的為類(lèi)定義uuid了,比如:

            DEFINE_UUID(ClassB,  ClassB) 
            class ClassB
            {
            //any code of ClassB
            }
            ;


            OK,現(xiàn)在試試__uuidof(ClassB),應(yīng)該返回字符串"ClassB"了。
            還有一點(diǎn)要說(shuō)明的是,為了能兼容UNICODE,可以定義兩個(gè)版本的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字符編碼編譯時(shí),__uuidof返回的就是unicode字符串了

            posted on 2008-01-21 21:29 深藍(lán)色系統(tǒng) 閱讀(366) 評(píng)論(0)  編輯 收藏 引用 所屬分類(lèi): 皮皮片片

            導(dǎo)航

            <2025年6月>
            25262728293031
            1234567
            891011121314
            15161718192021
            22232425262728
            293012345

            統(tǒng)計(jì)

            常用鏈接

            留言簿(75)

            隨筆分類(lèi)

            隨筆檔案

            文章分類(lèi)

            文章檔案

            搜索

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            色综合久久久久无码专区 | 国产综合精品久久亚洲| 看久久久久久a级毛片| 国产精品久久影院| 日韩美女18网站久久精品| 99久久国产精品免费一区二区| 国产精品对白刺激久久久| 国产精品一久久香蕉国产线看| 久久精品国产久精国产一老狼| 国产精品久久久久久久久软件| 综合网日日天干夜夜久久| 国产国产成人精品久久| 热综合一本伊人久久精品| 欧美大香线蕉线伊人久久| 久久精品中文字幕第23页| 一级做a爰片久久毛片毛片| 久久综合丝袜日本网| 麻豆av久久av盛宴av| 久久福利片| 日本一区精品久久久久影院| 97久久国产露脸精品国产| 久久精品国产一区二区 | 一本久久久久久久| 欧美日韩久久中文字幕| 久久青青草原精品国产软件| 99久久99这里只有免费的精品| 一本色道久久88综合日韩精品 | 国产精品美女久久久久| 久久亚洲高清综合| 久久国产精品-久久精品| 亚洲精品无码久久一线| 婷婷久久综合九色综合绿巨人| 国产精品久久久久乳精品爆| 天天爽天天狠久久久综合麻豆| 久久经典免费视频| 日韩欧美亚洲综合久久影院Ds| 国产精品日韩深夜福利久久| 青青国产成人久久91网| 伊人久久免费视频| 久久久久18| 一本色道久久88—综合亚洲精品 |