• <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
            <2025年6月>
            25262728293031
            1234567
            891011121314
            15161718192021
            22232425262728
            293012345

            專注于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)論
              
            国内精品久久国产大陆| 久久久久青草线蕉综合超碰| 成人免费网站久久久| 国产三级久久久精品麻豆三级| 久久婷婷国产麻豆91天堂| 激情久久久久久久久久| 国产精品久久久久久久人人看| 久久人人爽人人爽人人片av高请 | 国内精品久久久久久不卡影院| 色综合久久久久网| 久久人人爽人爽人人爽av| 无码人妻久久一区二区三区免费丨| 亚洲精品国产字幕久久不卡| 情人伊人久久综合亚洲| 伊人久久无码中文字幕| 久久最新精品国产| 欧洲精品久久久av无码电影| 久久夜色撩人精品国产| 久久精品国产半推半就| 久久精品国产亚洲AV香蕉| 精品乱码久久久久久夜夜嗨| AV色综合久久天堂AV色综合在| 久久亚洲中文字幕精品一区四| 72种姿势欧美久久久久大黄蕉| 久久久久久久久久久久久久| 精品无码久久久久久久动漫| 精品久久久久久亚洲| 久久天堂AV综合合色蜜桃网| 久久婷婷人人澡人人爽人人爱| 精品无码久久久久久久动漫| 亚洲午夜久久影院| 国产精品对白刺激久久久| 亚洲中文精品久久久久久不卡| 无码任你躁久久久久久老妇| 久久精品国产精品亚洲艾草网美妙 | 久久久久99精品成人片三人毛片| 国产∨亚洲V天堂无码久久久| 久久久久亚洲AV无码永不| 国产偷久久久精品专区| 久久精品一本到99热免费| 国产99久久久国产精品小说|