• <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年11月>
            2930311234
            567891011
            12131415161718
            19202122232425
            262728293012
            3456789

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

            常用鏈接

            留言簿(10)

            隨筆分類

            隨筆檔案

            相冊(cè)

            朋友

            • .NET

            搜索

            •  

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            Partial Template Specialization
            顧名思義,模版偏特化就是對(duì)模版進(jìn)行特化的意思。

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

            ????}
            ;

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

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

            ????}
            ;

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

            ????}
            ;

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

            ????}
            ;
            }

            ?第一段代碼是一個(gè)普通的template class,支持兩個(gè)模板參數(shù)。

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

            編譯器會(huì)幫你的代碼自動(dòng)匹配到最好的模板上面進(jìn)行實(shí)例化。

            這個(gè)有點(diǎn)類似于函數(shù)的重載,但是和重載是不一樣的,根據(jù)《深入探索C++對(duì)象模型》中的描述,函數(shù)重載會(huì)在運(yùn)行時(shí)發(fā)生,利用函數(shù)對(duì)象忠的vtable來實(shí)現(xiàn)的。而模版偏特化發(fā)生在編譯期間,由編譯器來自動(dòng)匹配完成的。沒有運(yùn)行時(shí)的開銷。

            注意幾點(diǎn):
            你能對(duì)已經(jīng)做過偏特化的class忠的成員函數(shù)做偏特化,而你想單獨(dú)對(duì)某個(gè)函數(shù)做偏特化這是不允許的。請(qǐng)看以下例子:
            這樣是被允許的:
            namespace?SHFTest
            {
            ????template
            <
            ????????????
            class?PLA,
            ????????????
            class?PLB
            ????????????
            >
            ????
            class?PLClass
            ????
            {
            ????????
            //
            ????????
            //?一般實(shí)現(xiàn)
            ????????
            //
            ????public:
            ????????PLClass()
            {};
            ????????
            ~PLClass(){};
            ????????
            void?FuncA(){};
            ????}
            ;

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

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

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

            ????}

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

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

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

            ????}

            }
            當(dāng)然直接偏特化namespace級(jí)別的函數(shù)也是不被允許的。你可以對(duì)這些函數(shù)做重載。這就意味著你只能更改函數(shù)的參數(shù)列表而不能改變函數(shù)的返回類型等。
            請(qǐng)看以下代碼:
            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)

            寫得不好,還請(qǐng)大家指正。

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

            函數(shù)重載為什么會(huì)在運(yùn)行時(shí)發(fā)生?

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

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

            重載函數(shù)/方法會(huì)被靜態(tài)綁定(編譯期綁定)。  回復(fù)  更多評(píng)論
              
            # re: 模版偏特化--Partial Template Specialization(《Modern C++ Design讀書筆記二》) 2008-01-08 11:36 風(fēng)舞影天
            @Gino
            我認(rèn)為樓主說的應(yīng)該是繼承而非重載,估計(jì)他把重載和繼承的概念混淆了或是記錯(cuò)了  回復(fù)  更多評(píng)論
              
            国产亚洲色婷婷久久99精品| 久久青青草原综合伊人| 久久久久人妻一区精品| 国产视频久久| 亚洲伊人久久成综合人影院| 尹人香蕉久久99天天拍| 亚洲欧美日韩中文久久| 激情伊人五月天久久综合| 99久久国产亚洲高清观看2024 | 中文字幕无码久久久| 国内精品伊人久久久久AV影院| 久久国产精品-国产精品| 香港aa三级久久三级老师2021国产三级精品三级在 | 中文字幕亚洲综合久久2| 少妇被又大又粗又爽毛片久久黑人 | 国产精品九九久久免费视频| 久久婷婷五月综合97色直播| 久久国产精品久久久| 丁香色欲久久久久久综合网| 激情五月综合综合久久69| 久久棈精品久久久久久噜噜| 亚洲国产高清精品线久久| 久久综合九色综合欧美狠狠| 亚洲综合精品香蕉久久网| 久久久这里只有精品加勒比| 日本久久久精品中文字幕| 亚洲级αV无码毛片久久精品| 久久影视综合亚洲| 中文精品久久久久国产网址| 7777久久亚洲中文字幕| 久久综合给合久久狠狠狠97色 | 久久精品国产亚洲AV无码娇色 | 久久亚洲国产欧洲精品一| 亚洲国产精品无码久久SM| 午夜肉伦伦影院久久精品免费看国产一区二区三区 | 久久久久亚洲精品男人的天堂| 国产精品青草久久久久婷婷| 久久精品无码午夜福利理论片| 99精品国产综合久久久久五月天| 一本色综合久久| 久久精品国产清自在天天线|