• <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>
            OnTheWay2012
            埋葬昨天的我,迎來重生的我!
            posts - 15,  comments - 89,  trackbacks - 0
            周五晚上的時候在看Boost的源碼的時候發現了shared_ptr有一個很好用的功能,該功能的代碼示例如下:
            boost::shared_ptr<int> pInt(new int(0));
            if (pInt)
            .
            .
            .
            從上述代碼中可以看出,shared_ptr能夠模擬內置指針的功能。我很好奇shared_ptr是如何實現的這個功能,然后就找到了shared_ptr的源代碼看了看,結果發現在VC9的編譯環境下,shared_ptr不是采用重載bool操作符來實現的,為什么不采用重載bool操作符來實現呢?用一下代碼說明:
            //如果采用重載bool操作符的形式來實現的話,會存在以下的一些問題,這些問題可以總結為“在不該使用的地方使用了隱含的類型轉換”
            shared_ptr<int> pInt(new int(0));
            int n = pInt;//如果采用重載布爾的方法,這句明顯應該是錯誤的語句就會編譯通過
            那么,Boost采用的方法是什么方法呢?Boost所采用的方法的是:
             typedef T * (this_type::*unspecified_bool_type)() const;   //Ln 1

                
            operator unspecified_bool_type() const // never throws  Ln2
            {
                    
            return px == 0? 0&this_type::get; //Ln3
                }
            當第一次看到這三行代碼的時候,我被震驚了!
            我看了半天都不知道這三行代碼到底是什么意思!周五晚上我用baidu,google搜了半天,終于發現Ln1不就是自己以前用過的指向成員函數的指針嗎?!我真蠢,看了半天還是沒看明白。那么一個問題解決了,另外一個更無法理解的問題出現了:為什么在寫下
            if(pInt)
            Ln2和Ln3所定義的函數會被調用!!!我找呀找,還是不明白!我問google呀,還是不明白!我問baidu呀,還是不明白!
            這個問題,折磨了我兩天,今天晚上的時候,有打開VC9,有一次看到這段代碼,突然就明白了。
            在Ln1定義了一個類型(指向成員函數指針);
            在Ln2和Ln3定義了一個函數,該函數是一個類型轉換函數,把shared_ptr,轉換為一個指向成員函數的指針。
            舉一個簡單的類型轉換函數的例子:
            class A
            {
            public:
                 
            operator int()
                 
            {
                      
            return 0;
                 }

            }


            void Test(int a)
            {
                 cout
            <<a<<endl;
            }


            void main()
            {
                 A a;
                 Test(a);
            //這里調用的是類型轉換函數
            }
            至于為什么這種方法比重載bool好,是因為指向成員函數的指針很少能夠被編譯器用來做隱含的類型轉換。

            現在終于明白了上面的代碼。雖然代碼里面的技術我都用過,但是當時為什么沒有像明白呢?!
            我分析原因有兩條:
            1. 最近好久沒有寫過代碼,生疏了。這是次要原因。
            2.對C++缺乏了解。這是主要原因。


            在解決這個問題的時候用google搜到了一個老外發的貼,大致內容如下:
            每當我覺得對C++有所了解或者掌握它的秘密的時候,我總發現一些改變我看發的事情。
            ....

            另外一個老外回答的時候用了一句話。I know the feelings.

            現在,我終于也有第一個老外的感覺了。
            posted on 2010-12-05 18:56 OnTheWay 閱讀(2307) 評論(4)  編輯 收藏 引用 所屬分類: 個人感悟

            FeedBack:
            # re: Why I am so stupid?
            2010-12-05 23:19 | right
            最近不知道怎么搞的,如果有人跟我研究這些C++的高級語法高級特性時,我總是有種想潑冷水的沖動。不過想想自己也是這么走過來的,也就逐漸釋然了。  回復  更多評論
              
            # re: Why I am so stupid?
            2010-12-06 08:44 | Sosi
            Boost 乃一大寶藏。。。  回復  更多評論
              
            # re: Why I am so stupid?
            2010-12-06 10:27 | 空明流轉
            寫boost的人是挖空心思從Spec里面想摳出點東西拿來用。

            那個令人發指的typeof更是連編譯器bug都用上了。

            你要是挖空心思,其實也是可以的。。。  回復  更多評論
              
            # re: Why I am so stupid?
            2010-12-13 17:53 | crossgate
            不覺得這個是C++的高級語法特性,覺得是比較常規的,實用的特性。

            如果if判斷的時候,統一用 if (!pInt),會更合適。重載!操作符,會更容易,也更一般化一些。  回復  更多評論
              

            <2010年12月>
            2829301234
            567891011
            12131415161718
            19202122232425
            2627282930311
            2345678

            常用鏈接

            留言簿(4)

            隨筆分類

            隨筆檔案

            友情連接

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

            久久久久人妻精品一区| 国产69精品久久久久APP下载| 久久亚洲国产成人精品无码区| 亚洲欧美精品伊人久久| 精品久久久久久无码中文字幕| 欧美亚洲国产精品久久| 久久国产成人精品国产成人亚洲| 久久亚洲国产成人精品无码区| 亚洲精品美女久久久久99| 久久精品一区二区三区不卡| 久久99精品久久久久婷婷| 久久精品久久久久观看99水蜜桃| 国产精自产拍久久久久久蜜| 国产精品久久久久久久久免费| 99精品国产99久久久久久97| 中文字幕无码久久人妻| 久久人人爽人人爽AV片| 久久久一本精品99久久精品88| 精品久久久久久无码免费| 久久久噜噜噜www成人网| 成人综合久久精品色婷婷| 国产精品99久久久久久董美香| 日日噜噜夜夜狠狠久久丁香五月| 伊人色综合久久天天人手人婷| 精品无码人妻久久久久久| 精品久久久久久无码专区| 久久99久久99精品免视看动漫| 久久精品国产一区二区电影| 久久精品中文字幕有码| 国产亚洲精品美女久久久| 欧美精品乱码99久久蜜桃| 色天使久久综合网天天| 天天综合久久一二三区| 久久精品18| 欧美粉嫩小泬久久久久久久| 久久国产热这里只有精品| 久久精品国产精品亚洲艾草网美妙 | 久久久久久亚洲Av无码精品专口| 狠狠色综合网站久久久久久久高清 | 伊人久久大香线蕉AV一区二区 | 亚洲级αV无码毛片久久精品|