• <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>
            posts - 18,  comments - 104,  trackbacks - 0
            先看看boost的實(shí)現(xiàn)吧。

             1 template<typename _T>
             2 struct wapper
             3 {};
             4 template <typename _T>
             5 _T&(* fun1(wapper<_T> t))();
             6 true_type fun1();
             7 
             8 class true_type{};
             9 class false_type
            10 {
            11     char c[8];
            12 };
            13 
            14 template<typename _T>
            15 true_type fun2(_T&(*)());
            16 false_type fun2();
            17 
            18 template<typename _T>
            19 struct is_reference
            20 {
            21     static const bool value = sizeof(fun2(fun1(wapper<_T>()))) == sizeof(false_type);
            22 };


            就是上面這個(gè)樣子,我做了一下簡化,更容易理解。

            下面是我的實(shí)現(xiàn)版本,最后再解釋。

             1 template<typename _T>
             2 class is_reference
             3 {
             4     template<typename _T>
             5     struct wapper
             6     {};
             7 
             8     class true_type{};
             9     class false_type
            10     {
            11         char c[8];
            12     };
            13 
            14     template <typename _T>
            15     static _T& fun1(wapper<_T>);
            16     static true_type fun1();
            17 
            18     template<typename _T>
            19     static true_type fun2(_T);
            20     static false_type fun2(true_type);
            21 public:
            22     static const bool value = sizeof(fun2(fun1(wapper<_T>()))) == sizeof(false_type);
            23 };

            用法如下:

            1 bool res1 = is_reference<char>::value;   //res1 == false
            2 bool res2 = is_reference<char&>::value;  //res2 == true

            函數(shù)參數(shù)會(huì)自動(dòng)去掉引用比如:
            template<_T> void fun(_T a);
            無論任何時(shí)候,_T總是非引用類型。

            但是不讓函數(shù)通過函數(shù)參數(shù)直接推導(dǎo)模板參數(shù)的類型,就給函數(shù)參數(shù)加一個(gè)間接層wapper,
            類模板不會(huì)自動(dòng)去掉引用,所以配合函數(shù)模板可以保證得到原來的類型。
             
            template<_T> void fun(wapper<_T> a);
            這時(shí)候,_T 就可能是引用類型了。因?yàn)閏++不支持引用的引用,當(dāng)模板函數(shù)中要用到引用的引用的時(shí)候,模板函數(shù)就會(huì)推導(dǎo)失敗。
            即,只要在函數(shù)fun的參數(shù)或者返回值里面含有_T&的話,fun就會(huì)推導(dǎo)失敗。從而編譯器會(huì)選擇 true_type fun(...);
            由于參數(shù)已經(jīng)被用于推導(dǎo)模板參數(shù),所以只能在返回類型中含有_T&,從而利用函數(shù)重載而區(qū)分引用和非引用。
            如果直接返回_T&類型,后面必須要定義只接受true_type類型參數(shù)的函數(shù)進(jìn)行區(qū)分,因?yàn)開T&肯定是引用類型,所以后面接受
            false_type fun2(true_type)的函數(shù)會(huì)被選擇。

            但是遇到is_reference<true_type>::value怎么辦,我把他們都放到私有域了,永遠(yuǎn)不會(huì)看到的,搞定。
            boost::trait中返回函數(shù)指針的解法也OK。因?yàn)閏har永遠(yuǎn)不可能成功匹配函數(shù)指針。

            此方法的關(guān)鍵在于編譯器選擇重載函數(shù)的先后順序。
            而boost::trait中的方法是char永遠(yuǎn)不能轉(zhuǎn)化成一個(gè)函數(shù)指針,從而選擇不同重載版本。

            解釋完畢。
            posted on 2009-02-20 21:44 尹東斐 閱讀(2130) 評(píng)論(5)  編輯 收藏 引用

            FeedBack:
            # re: boost::trait::is_reference 的研究與修改
            2009-02-20 21:48 | 發(fā)生地方
            不錯(cuò),不錯(cuò)  回復(fù)  更多評(píng)論
              
            # re: boost::trait::is_reference 的研究與修改[未登錄]
            2009-02-21 09:27 | jans2002
            高手,總覺得模板很玄乎,也沒有好的調(diào)試手段  回復(fù)  更多評(píng)論
              
            # re: boost::trait::is_reference 的研究與修改
            2009-02-21 10:35 | 尹東斐
            @jans2002

            模板現(xiàn)在是不好調(diào)試,不過好像VC 10的 intellisence 會(huì)有幫助吧。 還沒有用過。

            我目前的水平主要還是自己推,不知道大牛們玩模板是不是和咱寫程序一樣輕松。。。  回復(fù)  更多評(píng)論
              
            # re: boost::trait::is_reference 的研究與修改
            2009-04-21 12:10 | SL
            為何要過濾true_type?
            true_type 一樣是個(gè) type, 似乎沒有必要如此.

              回復(fù)  更多評(píng)論
              
            # re: boost::trait::is_reference 的研究與修改
            2009-04-21 23:24 | yindf
            @SL

            is_reference<true_type>::value
            被使用時(shí),fun1的第一個(gè)版本會(huì)被選擇,因?yàn)門被推導(dǎo)成true_type,所以最終結(jié)果是is_reference<true_type>::value == true,這是不對的。  回復(fù)  更多評(píng)論
              

            只有注冊用戶登錄后才能發(fā)表評(píng)論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


            <2009年3月>
            22232425262728
            1234567
            891011121314
            15161718192021
            22232425262728
            2930311234

            常用鏈接

            留言簿(4)

            隨筆檔案

            文章分類

            文章檔案

            相冊

            好友博客

            搜索

            •  

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            四虎国产精品成人免费久久| 亚洲av日韩精品久久久久久a| 久久久亚洲欧洲日产国码aⅴ | 色婷婷综合久久久久中文 | 国产精品久久久久久| 99999久久久久久亚洲| 久久精品中文字幕有码| 三级三级久久三级久久| 日韩精品久久久肉伦网站| 日本免费一区二区久久人人澡| 精品久久久久久无码中文字幕 | 久久国产精品免费一区| 国产亚洲美女精品久久久2020| 青青青国产成人久久111网站| 亚洲国产成人精品久久久国产成人一区二区三区综 | 久久久精品久久久久影院| 欧美va久久久噜噜噜久久| 国产成人精品综合久久久| 久久精品国产亚洲av麻豆蜜芽| 国产精品久久久久AV福利动漫| 久久午夜福利电影| 99久久免费国产精品| 精品综合久久久久久97| 成人a毛片久久免费播放| 看久久久久久a级毛片| 亚洲国产成人精品女人久久久 | 久久久国产亚洲精品| 精品久久久久久久| 一本一本久久a久久综合精品蜜桃| 国产精品欧美亚洲韩国日本久久| 久久天堂AV综合合色蜜桃网 | 99久久精品费精品国产 | 久久夜色精品国产噜噜亚洲a| 国产欧美一区二区久久| 久久国产免费观看精品3| 国产成人久久精品一区二区三区| 狠狠人妻久久久久久综合蜜桃| 91久久精一区二区三区大全| 中文字幕无码免费久久| 中文字幕久久精品无码| 国内精品久久国产|