• <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>
            隨筆 - 45  文章 - 129  trackbacks - 0
            <2009年5月>
            262728293012
            3456789
            10111213141516
            17181920212223
            24252627282930
            31123456

            專注于C++ P2P STL GP OpenSource等
            Google

            常用鏈接

            留言簿(10)

            隨筆分類

            隨筆檔案

            相冊

            朋友

            • .NET

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

            Partial Template Specialization
            顧名思義,模版偏特化就是對模版進行特化的意思。

            舉個例子:
            namespace?SHFTest
            {
            ????template
            <
            ????????????
            class?PLA,
            ????????????
            class?PLB
            ????????????
            >
            ????
            class?PLClass
            ????
            {
            ????????
            //
            ????????
            //?一般實現
            ????????
            //
            ????public:
            ????????PLClass()
            {};
            ????????
            ~PLClass(){};
            ????????
            void?FuncA()
            ????????
            {
            ????????}

            ????}
            ;

            ????typedef?myPLA;
            ????typedef?myPLB;

            ????
            //
            ????
            //?單參數特化實現,參數A
            ????
            //
            ????template<class?PLA>
            ????
            class?PLClass<PLA,myPLB>
            ????
            {
            ????????
            //
            ????????
            //?特化實現
            ????????
            //
            ????????PLClass(){};
            ????????
            ~PLClass(){};
            ????????
            void?FuncA()
            ????????
            {
            ????????}

            ????}
            ;

            ????
            //
            ????
            //?單參數特化實現,參數B
            ????
            //
            ????template<class?PLB>
            ????
            class?PLClass<myPLA,PLB>
            ????
            {
            ????????
            //
            ????????
            //?特化實現
            ????????
            //
            ????????PLClass(){};
            ????????
            ~PLClass(){};
            ????????
            void?FuncA()
            ????????
            {
            ????????}

            ????}
            ;

            ????
            //
            ????
            //?雙參數特化實現
            ????
            //
            ????template<>
            ????
            class?PLClass<myPLA,myPLB>
            ????
            {
            ????????
            //
            ????????
            //?特化實現
            ????????
            //
            ????????PLClass(){};
            ????????
            ~PLClass(){};
            ????????
            void?FuncA()
            ????????
            {
            ????????}

            ????}
            ;
            }

            ?第一段代碼是一個普通的template class,支持兩個模板參數。

            假如我對于某種對象,需要做特殊化的處理,這樣就要用到模版偏特化了:
            例如第二段代碼,第三段代碼,第四段代碼分別對參數A,參數B和兩個參數做了偏特化。

            編譯器會幫你的代碼自動匹配到最好的模板上面進行實例化。

            這個有點類似于函數的重載,但是和重載是不一樣的,根據《深入探索C++對象模型》中的描述,函數重載會在運行時發生,利用函數對象忠的vtable來實現的。而模版偏特化發生在編譯期間,由編譯器來自動匹配完成的。沒有運行時的開銷。

            注意幾點:
            你能對已經做過偏特化的class忠的成員函數做偏特化,而你想單獨對某個函數做偏特化這是不允許的。請看以下例子:
            這樣是被允許的:
            namespace?SHFTest
            {
            ????template
            <
            ????????????
            class?PLA,
            ????????????
            class?PLB
            ????????????
            >
            ????
            class?PLClass
            ????
            {
            ????????
            //
            ????????
            //?一般實現
            ????????
            //
            ????public:
            ????????PLClass()
            {};
            ????????
            ~PLClass(){};
            ????????
            void?FuncA(){};
            ????}
            ;

            ????typedef?myPLA;
            ????typedef?myPLB;

            ????
            //
            ????
            //?單參數特化實現,參數A
            ????
            //
            ????template<class?PLA>
            ????
            class?PLClass<PLA,myPLB>
            ????
            {
            ????????
            //
            ????????
            //?特化實現
            ????????
            //
            ????????PLClass(){};
            ????????
            ~PLClass(){};
            ????????
            void?FuncA();
            ????}
            ;

            ????template
            <class?PLA>
            ????
            void?PLClass<PLA,myPLB>::FuncA()
            ????
            {

            ????}

            }
            而下面的這種情況是不允許的,編譯不過的:
            namespace?SHFTest
            {
            ????template
            <
            ????????????
            class?PLA,
            ????????????
            class?PLB
            ????????????
            >
            ????
            class?PLClass
            ????
            {
            ????????
            //
            ????????
            //?一般實現
            ????????
            //
            ????public:
            ????????PLClass()
            {};
            ????????
            ~PLClass(){};
            ????????
            void?FuncA();
            ????}
            ;

            ????typedef?myPLA;
            ????typedef?myPLB;

            ????template
            <class?PLA>
            ????
            void?PLClass<PLA,myPLB>::FuncA()
            ????
            {

            ????}

            }
            當然直接偏特化namespace級別的函數也是不被允許的。你可以對這些函數做重載。這就意味著你只能更改函數的參數列表而不能改變函數的返回類型等。
            請看以下代碼:
            template?<class?T,?class?U>?T?Fun(U?obj);?
            //primary?template
            template?<class?U>?void?Fun<void,?U>(U?obj);?
            //illegal?partial?specialization
            template?<class?T>?T?Fun?(Window?obj);?
            //legal?(overloading)

            寫得不好,還請大家指正。
            posted on 2006-12-30 17:30 CPP&&設計模式小屋 閱讀(4059) 評論(3)  編輯 收藏 引用 所屬分類: Modern C++ Design,BOOST,LOKI讀書筆記

            FeedBack:
            # re: 模版偏特化--Partial Template Specialization(《Modern C++ Design讀書筆記二》) 2007-09-16 15:57 張衛華
            修改函數的返回值和參數,只是覆蓋,不是重載  回復  更多評論
              
            # re: 模版偏特化--Partial Template Specialization(《Modern C++ Design讀書筆記二》) 2008-01-07 14:23 Gino
            > 這個有點類似于函數的重載,但是和重載是不一樣的,根據《深度探索C++對
            > 象模型》中的描述,函數重載會在運行時發生,利用函數對象忠的vtable來
            > 實現的。

            函數重載為什么會在運行時發生?

            我很疑惑你的看法。我沒有在《深度探索C++對象模型》中找到對應的話,(幾個月前剛看過,也許我漏掉了。)

            重載只是一個對C++程序員來講有意義的名詞,但解釋后的C代碼中,根本就沒有這個概念。

            重載函數/方法會被靜態綁定(編譯期綁定)。  回復  更多評論
              
            # re: 模版偏特化--Partial Template Specialization(《Modern C++ Design讀書筆記二》) 2008-01-08 11:36 風舞影天
            @Gino
            我認為樓主說的應該是繼承而非重載,估計他把重載和繼承的概念混淆了或是記錯了  回復  更多評論
              
            国产亚洲美女精品久久久| 麻豆AV一区二区三区久久| 国产成人久久精品麻豆一区| 青青热久久综合网伊人| 久久久久国色AV免费观看| 久久亚洲精品成人无码网站| 久久人人爽爽爽人久久久| 久久精品人妻一区二区三区| 久久伊人五月丁香狠狠色| 中文字幕亚洲综合久久2| 伊人久久久AV老熟妇色| 久久亚洲av无码精品浪潮| 久久99精品国产| 欧美亚洲色综久久精品国产| 亚洲欧美另类日本久久国产真实乱对白| 久久精品国产亚洲av麻豆小说| 97超级碰碰碰碰久久久久| 久久精品无码一区二区WWW | 亚洲国产高清精品线久久 | 国产精品成人无码久久久久久| 97精品依人久久久大香线蕉97| 久久久噜噜噜久久| 久久国产一区二区| 99久久无码一区人妻a黑| 日本欧美久久久久免费播放网| 久久99热这里只频精品6| 欧美麻豆久久久久久中文| 狠狠色丁香婷婷综合久久来来去| 国产精品久久久久jk制服| 久久精品无码专区免费青青| 国产精品久久婷婷六月丁香| 欧美日韩精品久久久免费观看| 久久WWW免费人成—看片| 国产三级精品久久| 亚洲国产成人久久精品动漫| 久久国产精品久久久| 99999久久久久久亚洲| 香港aa三级久久三级| 久久久精品久久久久久| 久久久WWW成人免费精品| 亚洲国产精品综合久久一线|