青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

cexer

cexer
posts - 12, comments - 334, trackbacks - 0, articles - 0
  C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

更好地仿真VC++關鍵字__uuidof

Posted on 2008-07-05 20:58 cexer 閱讀(2828) 評論(8)  編輯 收藏 引用 所屬分類: utility

轉帖請注明出處 http://m.shnenglu.com/cexer/archive/2008/07/05/55419.html

  世界上有個叫__uuidof的關鍵字。這是一個家喻戶曉且其被廣泛使用的關鍵字,幾乎可以說,有COM程序員的地方,就有它 __uuidof的存在。其很好很強大的程度是人所共見的,夸張一點比喻:離開它的COM程序員,就像失去了點火器的火箭,雖然可以人工點火,但是不安全且無效率。

  不過很多人并不知道,這其實是一個編譯器擴展關鍵字,提供了此關鍵字的僅VC一家別無它店。幸運的是,強大的C++讓我們能夠輕易仿真出這個關鍵字的大部分功能。

  網上能夠找到一種仿真的方法,見許式偉:《仿真VC++提供的關鍵字__uuidof》。該方法的實現是:特化模板類的成員函數,然后運行時調用函數根據UUID字符串產生出UUID,由于是生成于運行時,所以它無可避免地有兩個缺點:

  • 存在運行時消耗。
  • 無法作為非類型模板參數傳遞給模板。

  那些整天流著口水追求效率的C++程序員們,是不能忍受任何不必要的運行時消耗的。對于第二點,VC的關鍵字__uuidof取出來的UUID是能夠作為非類型模板參數傳遞的,ATL中就大量地使用了這樣的參數傳遞形式,所以目前的這種實現功能有限,仿真度還不夠高。

  其實只要能讓它能夠編譯期決定UUID的值,那么這兩個問題就迎刃而解了。而這是肯定可以實現的,并且很簡單。我曾經在自己寫的一個COM庫里實現過這樣的方法,雖然那個庫已經不知丟到哪里去了,不過那個方法還記得。

  解決的途徑還是離不開模板特化。類的成員包括成員函數和成員變量,函數是運行時作用的,然而static const的成員變量可以是編譯期就決定。所以解決的方法就在眼前了:特化模板的成員變量。

  以下是我的實現方法。

  先定義一個類模板,它有一個static const ,UUID類型的成員變量:

    template<typename T>   
struct _uuid_of_impl
{
static const UUID id;
};
template<typename T>
const UUID _uuid_of_impl<T>::id=GUID_NULL;

  有了這個簡單的東西就好辦了,只需要針對某個接口特它的成員變量就行了,如:

    template<>    
const UUID _uuid_of_impl<IUnknown>::id=IID_IUnknown;

template<>
const UUID _uuid_of_impl<IDispatch>::id=IID_IDispatch;



  然后我們就可以這樣取得接口的UUID:

    IID IunknownID=_uuid_of_impl<IUnknown>::id;   
IID IdispatchID=_uuid_of_impl<IDispatch>::id;


  作為非類型模板參數傳遞:

    template<const IID* t_iid>   
struct __uuid_of_test
{
__uuid_of_test()
{}

void test()
{
t_iid;
}
};

__uuid_of_test<&(_uuid_of_impl<IDispatch>::id) > obj;


  不過現在這種實現還有一些問題,看以下代碼:

    IID ITypelibID=_uuid_of_impl<ITypeLib>::id;


  注意我們并沒有事先對模板__uuid_of_impl特化ITypeLib的版本。但是以上語句卻能夠編譯通過,在運行時,__uuid_of_impl<ITypeLib>的值將會是錯誤的值GUID_NULL。這是因為,我們定義模板的時候,同時在模板外定義了模板的靜態成員變量并賦值為GUID_NULL,所以沒有用特化的方法定義UUID的接口,都將使用GUID_NULL這個通用值。這當然不是我們想要的。所以我們想在沒有定義UUID的時候讓編譯器警告我們,要達到這樣的效果只需要去掉上面那句:

    template<typename T>   
const UUID _uuid_of_impl<T>::id=GUID_NULL;


  現在再進行編譯,編譯器會告訴你,有一個無法解析的符號。根據編譯器提供的相關信息,很容易就能確定問題所在。這樣能夠在編譯期極大地減小安全隱患。

  最后加上我們定義的幾個宏,這是最后的全部實現:

    template<typename T>   
struct _uuid_of_impl
{
static const UUID id;
};

#define uuid_of(x) _uuid_of_impl<x>::id
#define DEFINE_UUID(x,l,w1,w2,b1,b2,b3,b4,b5,b6,b7,b8) \
template<> \
const UUID _uuid_of_impl<x>::id={l,w1,w2,{b1,b2,b3,b4,b5,b6,b7,b8}}


  用以下代碼測試通過:

    struct ITest{};   

DEFINE_UUID(ITest,0x96289151,0xf059,0x4049,0x88,0x19,0x61,0xa6,0xe9,0x79,0xc,0xf1);

template<const IID* t_iid>
struct uuid_of_test
{
uuid_of_test(){}
};

int main()
{
IID xxxxID=uuid_of(ITest);
uuid_of_test<&(uuid_of(ITest))> obj;

return 0;
}


  需要注意的是DEFINE_UUID應該在實現文件(*.cpp,*.cxx,……)當中使用。到這里,仍有一些使用方法與VC的關鍵字是不一樣的,所以仍沒做到仿真度100%。不過我相信通過預處理元編程,能夠相當程度地逼近它,只是我對預處理元編程不是很了解,所以就不在這里獻丑了。

Feedback

# re: 更好地仿真VC++關鍵字__uuidof  回復  更多評論   

2008-07-06 02:15 by 放屁啊狗
我感覺ms的com快走向末路了,沒有啥創新。ms走的就是自我封閉,自戀、自殘的路線

# re: 更好地仿真VC++關鍵字__uuidof  回復  更多評論   

2008-07-06 05:33 by www.helpsoff.com.cn
好不容易在cppblog.com看到一篇真正的技術文章,不過看到的回復又實在讓人如鯁在喉。“放屁阿狗”仁兄,君不知COM的技術和概念是多少現在所謂前沿技術和概念的基礎,不知道是在睜眼說瞎話還是在這里說反話吸引眼球?

# re: 更好地仿真VC++關鍵字__uuidof  回復  更多評論   

2008-07-06 09:51 by 空明流轉
@www.helpsoff.com.cn
這里技術文章也不少了。。。為什么叫真正的?
boost上有一個uuid的實現好像。
還有COM,這個東西確實很繁雜,但是概念上沒什么問題,就是實現很拖沓。

# re: 更好地仿真VC++關鍵字__uuidof  回復  更多評論   

2008-07-06 09:55 by pang
你好 我是出版社的編輯,我看到你博客中的內容,感覺寫的非常好,如果想把這些內容

和更多的人分享,可以和我聯系,把這些東西寫成書。
我的郵箱:books_522008@yahoo.com.cn
或者加我的MSN:pyq_19852008@hotmail.com

# re: 更好地仿真VC++關鍵字__uuidof  回復  更多評論   

2008-07-06 10:38 by toperray
看看ADOBE、firefox等等的基礎技術吧,com消亡了?

沒有,而且越來越多的被采用。

# re: 更好地仿真VC++關鍵字__uuidof  回復  更多評論   

2008-07-06 12:17 by cexer
# re: 更好地仿真VC++關鍵字__uuidof 回復 更多評論 刪除評論
2008-07-06 02:15 by 放屁啊狗
我感覺ms的com快走向末路了,沒有啥創新。ms走的就是自我封閉,自戀、自殘的路線


Microsoft的技術從剛誕生的時候,會被人認定要不幸夭亡。當它成長成熟起來的時候,又會被認定在新技術四面夾擊的情況下必定被淘汰。但是事實證明了,那些擔憂都是多余的嘛,現在微軟的COM還是軟件組件模型的最廣泛實現和應用的方式。我相反覺得,微軟走的路線并不是封閉自戀,而是學習各家所長并融匯到自己的技術里。

# re: 更好地仿真VC++關鍵字__uuidof  回復  更多評論   

2008-07-06 12:23 by cexer
謝謝上面回復的www.helpsoff.com.cn,我這個就是一點小技巧,還真說不上是“技術”。謝謝你的支持,我會努力的。

謝謝pang,謝謝支持。

# re: 更好地仿真VC++關鍵字__uuidof  回復  更多評論   

2008-07-06 15:45 by www.helpsoff.com.cn
回空明流轉,因為經常在cppblog上看到聊面試的,又有進而聊面試過程的,然后又進而有聊自己如何管理別人的...所以一看到這篇有思考過程有代碼的文章,禁不住說“真正的”,哈哈,見諒見諒...
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            欧美一区二区三区视频免费| 香蕉久久夜色精品国产| 欧美激情视频在线免费观看 欧美视频免费一 | 日韩午夜av电影| 欧美日韩亚洲网| 午夜国产精品影院在线观看| 亚洲一区二区视频在线| 国产九区一区在线| 久久一区二区三区四区| 久久久免费精品| 亚洲剧情一区二区| 这里只有精品视频| 韩国成人精品a∨在线观看| 久久亚洲精品一区| 欧美激情视频一区二区三区在线播放| 一本久道久久久| 亚洲视频导航| 在线观看国产一区二区| 最新日韩欧美| 国产精品日韩久久久| 久久久久在线观看| 欧美片第一页| 久久久久久久国产| 欧美日韩高清在线一区| 欧美在线3区| 欧美国产亚洲另类动漫| 欧美一区二区三区在线| 久久亚洲一区| 亚洲欧美激情四射在线日| 久久先锋影音| 欧美一区二区免费观在线| 免费不卡视频| 欧美在线观看一区| 欧美精品一区二区三区蜜桃 | 亚洲精品久久久久久久久| 99re国产精品| 在线日本成人| 亚洲欧美日韩视频二区| 亚洲精品日韩激情在线电影| 亚洲欧美日韩在线不卡| 日韩视频在线观看国产| 欧美一区二区三区在线看| 日韩一级精品视频在线观看| 久久精品99国产精品酒店日本| 亚洲亚洲精品在线观看| 免费高清在线一区| 久久露脸国产精品| 国产精品一区毛片| 一本久久综合亚洲鲁鲁| 99re6这里只有精品视频在线观看| 欧美在线免费| 欧美在线观看视频在线| 欧美三区在线视频| 亚洲精品影视在线观看| 亚洲高清色综合| 久久久久久久一区二区三区| 欧美一级专区| 国产精品你懂得| 一区二区三区欧美日韩| 亚洲私人影院| 欧美午夜久久久| 夜夜爽www精品| 中日韩美女免费视频网址在线观看| 久久综合色婷婷| 麻豆视频一区二区| 激情小说亚洲一区| 久久精品二区亚洲w码| 欧美综合激情网| 国产亚洲精品美女| 欧美在线亚洲在线| 久久久噜噜噜久久久| 国产亚洲精品v| 久久国产精品一区二区三区四区 | 中文网丁香综合网| 欧美日韩在线一区| 99精品国产高清一区二区| 亚洲深夜福利网站| 国产精品女主播在线观看| 国产精品99久久久久久人| 午夜激情一区| 国产欧美一区在线| 久久精品国产99国产精品澳门| 另类综合日韩欧美亚洲| 亚洲成人在线视频播放| 欧美成人情趣视频| 一区二区电影免费观看| 欧美一区二区女人| 亚洲承认在线| 欧美日韩精品久久| 欧美怡红院视频| 欧美成人午夜剧场免费观看| 99在线观看免费视频精品观看| 国产精品av免费在线观看| 亚洲欧美网站| 亚洲国产精品久久久久婷婷884| 日韩亚洲欧美精品| 国产精品捆绑调教| 久久久中精品2020中文| 亚洲免费观看视频| 久久综合给合| 亚洲视频二区| 伊人婷婷欧美激情| 欧美日韩国产专区| 久久精品国产免费看久久精品| 91久久视频| 久久久777| 亚洲一区激情| 亚洲二区三区四区| 国产精品人成在线观看免费| 久久综合综合久久综合| 亚洲主播在线播放| 91久久精品国产91久久性色| 久久精品国产精品亚洲综合| 亚洲精品久久久久| 红杏aⅴ成人免费视频| 欧美色视频一区| 嫩草影视亚洲| 久久黄色小说| 亚洲尤物在线视频观看| 亚洲人成网站在线播| 久久久久久久久久久成人| 亚洲欧美日韩专区| aa级大片欧美| 亚洲国产精品一区二区www在线 | 欧美日韩国产在线播放| 久久精品国产亚洲精品 | 欧美激情五月| 麻豆国产精品一区二区三区 | 欧美一区影院| 亚洲一区二区三区免费视频| 亚洲清纯自拍| 亚洲黄色精品| 影院欧美亚洲| 亚洲成人影音| 在线欧美影院| 亚洲国产精品黑人久久久| 国内精品福利| 精品动漫3d一区二区三区免费版 | 国产欧美日韩免费| 国产精品毛片a∨一区二区三区| 欧美日韩三区四区| 欧美日韩亚洲综合在线| 欧美日韩伦理在线| 欧美精品在线观看91| 欧美经典一区二区| 欧美日韩1区2区| 欧美日韩免费观看一区二区三区 | 欧美国产视频在线| 欧美国产欧美亚洲国产日韩mv天天看完整 | 国产精品久久久对白| 欧美午夜不卡影院在线观看完整版免费 | 亚洲一区二区三区在线看| 一区二区三欧美| 亚洲婷婷免费| 欧美一级视频精品观看| 久久成人精品视频| 狼人社综合社区| 欧美激情五月| 欧美性事在线| 国产日韩欧美在线看| 黑人操亚洲美女惩罚| 影音先锋成人资源站| 亚洲免费观看高清完整版在线观看熊 | 国产精品永久免费观看| 国产区亚洲区欧美区| 精品成人久久| 一区二区三区成人| 欧美一级大片在线观看| 蜜桃精品一区二区三区| 亚洲欧洲一区二区天堂久久 | 免费试看一区| 日韩视频免费观看| 欧美一区二区观看视频| 久久先锋影音av| 欧美三区在线视频| 国内成+人亚洲+欧美+综合在线| 亚洲片在线资源| 午夜欧美不卡精品aaaaa| 猛干欧美女孩| 一区二区三区欧美成人| 久久久国产91| 国产精品久久久久久久久久免费 | 女人香蕉久久**毛片精品| 亚洲经典在线看| 午夜亚洲精品| 欧美日韩精品一区二区天天拍小说| 国产欧美日韩亚洲精品| 亚洲黄页一区| 久久精品一区二区三区不卡牛牛| 亚洲国产网站| 欧美一区二区三区在线视频| 欧美福利在线观看| 激情视频亚洲| 亚欧成人在线| 99成人精品| 欧美h视频在线| 狠狠色丁香婷婷综合| 午夜欧美理论片| 亚洲毛片在线免费观看| 老色批av在线精品|