• <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
            <2006年12月>
            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&&設計模式小屋 閱讀(4049) 評論(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狠狠色丁香婷婷综合久久| 国产产无码乱码精品久久鸭| 丁香五月综合久久激情| 久久久久久综合网天天| 潮喷大喷水系列无码久久精品| 久久综合综合久久狠狠狠97色88 | 亚洲精品99久久久久中文字幕| 亚洲国产精品无码久久一区二区 | 精品国产91久久久久久久a | 久久人人爽人人爽人人AV东京热| 2020最新久久久视精品爱| 亚洲va中文字幕无码久久| 91久久精品视频| 久久久无码人妻精品无码| 久久毛片一区二区| 国内精品久久久久国产盗摄| 久久精品九九亚洲精品| 一本大道久久香蕉成人网| 国产精品gz久久久| 久久99中文字幕久久| 狠狠综合久久综合88亚洲| 狠狠精品久久久无码中文字幕| 精品国产综合区久久久久久| 久久精品人人做人人爽97| 狠狠色狠狠色综合久久| 久久免费看黄a级毛片| 中文字幕无码久久人妻| 免费一级欧美大片久久网| 欧美大战日韩91综合一区婷婷久久青草| 久久亚洲美女精品国产精品| 伊人久久无码中文字幕| 久久夜色精品国产亚洲| 精品无码久久久久国产| 韩国免费A级毛片久久| 国产精品美女久久久|