• <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
            埋葬昨天的我,迎來(lái)重生的我!
            posts - 15,  comments - 89,  trackbacks - 0
            周五晚上的時(shí)候在看Boost的源碼的時(shí)候發(fā)現(xiàn)了shared_ptr有一個(gè)很好用的功能,該功能的代碼示例如下:
            boost::shared_ptr<int> pInt(new int(0));
            if (pInt)
            .
            .
            .
            從上述代碼中可以看出,shared_ptr能夠模擬內(nèi)置指針的功能。我很好奇shared_ptr是如何實(shí)現(xiàn)的這個(gè)功能,然后就找到了shared_ptr的源代碼看了看,結(jié)果發(fā)現(xiàn)在VC9的編譯環(huán)境下,shared_ptr不是采用重載bool操作符來(lái)實(shí)現(xiàn)的,為什么不采用重載bool操作符來(lái)實(shí)現(xiàn)呢?用一下代碼說(shuō)明:
            //如果采用重載bool操作符的形式來(lái)實(shí)現(xiàn)的話,會(huì)存在以下的一些問(wèn)題,這些問(wèn)題可以總結(jié)為“在不該使用的地方使用了隱含的類型轉(zhuǎn)換”
            shared_ptr<int> pInt(new int(0));
            int n = pInt;//如果采用重載布爾的方法,這句明顯應(yīng)該是錯(cuò)誤的語(yǔ)句就會(huì)編譯通過(guò)
            那么,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
                }
            當(dāng)?shù)谝淮慰吹竭@三行代碼的時(shí)候,我被震驚了!
            我看了半天都不知道這三行代碼到底是什么意思!周五晚上我用baidu,google搜了半天,終于發(fā)現(xiàn)Ln1不就是自己以前用過(guò)的指向成員函數(shù)的指針嗎?!我真蠢,看了半天還是沒(méi)看明白。那么一個(gè)問(wèn)題解決了,另外一個(gè)更無(wú)法理解的問(wèn)題出現(xiàn)了:為什么在寫(xiě)下
            if(pInt)
            Ln2和Ln3所定義的函數(shù)會(huì)被調(diào)用!!!我找呀找,還是不明白!我問(wèn)google呀,還是不明白!我問(wèn)baidu呀,還是不明白!
            這個(gè)問(wèn)題,折磨了我兩天,今天晚上的時(shí)候,有打開(kāi)VC9,有一次看到這段代碼,突然就明白了。
            在Ln1定義了一個(gè)類型(指向成員函數(shù)指針);
            在Ln2和Ln3定義了一個(gè)函數(shù),該函數(shù)是一個(gè)類型轉(zhuǎn)換函數(shù),把shared_ptr,轉(zhuǎn)換為一個(gè)指向成員函數(shù)的指針。
            舉一個(gè)簡(jiǎn)單的類型轉(zhuǎn)換函數(shù)的例子:
            class A
            {
            public:
                 
            operator int()
                 
            {
                      
            return 0;
                 }

            }


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


            void main()
            {
                 A a;
                 Test(a);
            //這里調(diào)用的是類型轉(zhuǎn)換函數(shù)
            }
            至于為什么這種方法比重載bool好,是因?yàn)橹赶虺蓡T函數(shù)的指針很少能夠被編譯器用來(lái)做隱含的類型轉(zhuǎn)換。

            現(xiàn)在終于明白了上面的代碼。雖然代碼里面的技術(shù)我都用過(guò),但是當(dāng)時(shí)為什么沒(méi)有像明白呢?!
            我分析原因有兩條:
            1. 最近好久沒(méi)有寫(xiě)過(guò)代碼,生疏了。這是次要原因。
            2.對(duì)C++缺乏了解。這是主要原因。


            在解決這個(gè)問(wèn)題的時(shí)候用google搜到了一個(gè)老外發(fā)的貼,大致內(nèi)容如下:
            每當(dāng)我覺(jué)得對(duì)C++有所了解或者掌握它的秘密的時(shí)候,我總發(fā)現(xiàn)一些改變我看發(fā)的事情。
            ....

            另外一個(gè)老外回答的時(shí)候用了一句話。I know the feelings.

            現(xiàn)在,我終于也有第一個(gè)老外的感覺(jué)了。
            posted on 2010-12-05 18:56 OnTheWay 閱讀(2309) 評(píng)論(4)  編輯 收藏 引用 所屬分類: 個(gè)人感悟

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

            那個(gè)令人發(fā)指的typeof更是連編譯器bug都用上了。

            你要是挖空心思,其實(shí)也是可以的。。。  回復(fù)  更多評(píng)論
              
            # re: Why I am so stupid?
            2010-12-13 17:53 | crossgate
            不覺(jué)得這個(gè)是C++的高級(jí)語(yǔ)法特性,覺(jué)得是比較常規(guī)的,實(shí)用的特性。

            如果if判斷的時(shí)候,統(tǒng)一用 if (!pInt),會(huì)更合適。重載!操作符,會(huì)更容易,也更一般化一些。  回復(fù)  更多評(píng)論
              

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

            常用鏈接

            留言簿(4)

            隨筆分類

            隨筆檔案

            友情連接

            搜索

            •  

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            久久精品国内一区二区三区| 久久香蕉国产线看观看精品yw| 九九精品99久久久香蕉| 2019久久久高清456| 国产精品久久久久久搜索| 久久精品国产精品亚洲精品 | 午夜精品久久久久久久久| 久久人人超碰精品CAOPOREN | 久久丝袜精品中文字幕| 久久99精品国产麻豆婷婷| 国产高潮国产高潮久久久91| 亚洲乱亚洲乱淫久久| 久久99精品国产麻豆宅宅| 久久精品国产影库免费看 | 国产日韩久久免费影院| 国产福利电影一区二区三区,免费久久久久久久精 | 亚洲国产成人久久综合野外| 人妻系列无码专区久久五月天| 久久亚洲中文字幕精品一区| 日韩AV毛片精品久久久| 99久久综合国产精品免费| 国产成年无码久久久免费| 波多野结衣AV无码久久一区| 久久亚洲精品人成综合网| 久久er热视频在这里精品| 品成人欧美大片久久国产欧美| 日本亚洲色大成网站WWW久久| 久久久久亚洲AV片无码下载蜜桃| 色综合久久综合中文综合网| 国产精品久久久久久一区二区三区| 热re99久久精品国产99热| 午夜精品久久久内射近拍高清| 久久国产欧美日韩精品| 久久99国产精品久久99| 久久免费视频6| 国产午夜精品久久久久免费视 | 狠狠精品干练久久久无码中文字幕 | 精品熟女少妇av免费久久| 久久er国产精品免费观看8| 久久精品国产亚洲AV忘忧草18| 好属妞这里只有精品久久|