• <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)論排行榜

            国产成人久久精品一区二区三区 | 精品久久久久久久| 久久国产精品77777| 国产成人精品久久一区二区三区| 免费精品99久久国产综合精品| 少妇久久久久久被弄到高潮 | 久久亚洲天堂| 国产激情久久久久久熟女老人| 99久久精品国内| 怡红院日本一道日本久久 | 亚洲AV伊人久久青青草原| 精品久久久无码21p发布| 久久精品嫩草影院| 亚洲精品无码久久久久| 国产精自产拍久久久久久蜜| 亚洲成色WWW久久网站| 国产免费久久精品99久久| 亚洲国产另类久久久精品| 久久久久综合国产欧美一区二区 | 久久久久久国产精品美女| 人妻久久久一区二区三区| 久久乐国产精品亚洲综合| 青青草国产精品久久久久| 久久亚洲精品国产精品| 亚洲天堂久久久| 中文字幕久久亚洲一区| 久久久久久久综合日本| 国产免费久久久久久无码| 久久精品国产一区二区三区日韩| 天天爽天天狠久久久综合麻豆| 久久婷婷五月综合国产尤物app| 伊人久久大香线蕉综合网站| 精品久久久久久无码中文字幕| 亚洲国产精品人久久| 久久青草国产精品一区| 国产99久久精品一区二区| 久久精品无码一区二区三区| 曰曰摸天天摸人人看久久久| 大蕉久久伊人中文字幕| 国内精品久久久久久久影视麻豆| 国产精品亚洲综合专区片高清久久久|