• <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
            我認為樓主說的應該是繼承而非重載,估計他把重載和繼承的概念混淆了或是記錯了  回復  更多評論
              
            性高湖久久久久久久久| 国产麻豆精品久久一二三| 久久不见久久见免费影院www日本| 久久电影网2021| 久久精品女人天堂AV麻| 亚洲精品午夜国产VA久久成人| 久久99免费视频| 亚洲精品无码久久毛片| 久久久久人妻精品一区二区三区| 丰满少妇人妻久久久久久4| 久久精品国产亚洲AV不卡| 91精品国产91久久久久久| 模特私拍国产精品久久| 人人狠狠综合久久亚洲婷婷| 久久人妻AV中文字幕| 国产精品久久久久久久久久免费| 久久久久亚洲av成人网人人软件| 久久99免费视频| 久久精品国产清高在天天线| 亚洲欧美国产日韩综合久久| 亚洲国产成人久久综合碰碰动漫3d| 日韩人妻无码一区二区三区久久99 | 久久只有这里有精品4| 嫩草影院久久99| 久久香蕉国产线看观看精品yw| 久久人人爽人人爽AV片| 国产福利电影一区二区三区,免费久久久久久久精 | 国内精品伊人久久久久av一坑 | 久久精品国产亚洲AV久| 久久精品中文字幕有码| 四虎国产精品免费久久5151| 久久精品人人槡人妻人人玩AV| 久久精品人妻一区二区三区| 99国内精品久久久久久久| 精品久久久久久国产潘金莲| 亚洲欧美伊人久久综合一区二区| 伊人久久无码精品中文字幕| 久久电影网| 久久夜色精品国产www| 欧洲国产伦久久久久久久| 久久久精品无码专区不卡|