• <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
            <2007年12月>
            2526272829301
            2345678
            9101112131415
            16171819202122
            23242526272829
            303112345

            專注于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來(lái)實(shí)現(xiàn)的。而模版偏特化發(fā)生在編譯期間,由編譯器來(lái)自動(dòng)匹配完成的。沒(méi)有運(yùn)行時(shí)的開(kāi)銷。

            注意幾點(diǎn):
            你能對(duì)已經(jīng)做過(guò)偏特化的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()
            ????
            {

            ????}

            }
            而下面的這種情況是不允許的,編譯不過(guò)的:
            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)

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

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

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

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

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

            重載函數(shù)/方法會(huì)被靜態(tài)綁定(編譯期綁定)。  回復(fù)  更多評(píng)論
              
            # re: 模版偏特化--Partial Template Specialization(《Modern C++ Design讀書(shū)筆記二》) 2008-01-08 11:36 風(fēng)舞影天
            @Gino
            我認(rèn)為樓主說(shuō)的應(yīng)該是繼承而非重載,估計(jì)他把重載和繼承的概念混淆了或是記錯(cuò)了  回復(fù)  更多評(píng)論
              
            伊色综合久久之综合久久| 久久亚洲私人国产精品vA| 99久久99久久精品免费看蜜桃| 色综合久久综合中文综合网| 好久久免费视频高清| 国产精品成人99久久久久| 人妻无码久久精品| 久久ZYZ资源站无码中文动漫| 狠狠干狠狠久久| 伊人热热久久原色播放www| 久久综合给久久狠狠97色| 久久AAAA片一区二区| 久久精品无码一区二区无码| 久久国产乱子伦精品免费午夜| 囯产极品美女高潮无套久久久| 久久夜色tv网站| 日韩精品久久久久久久电影蜜臀| 97久久精品人人做人人爽| 亚洲午夜无码久久久久| 久久乐国产精品亚洲综合| 精品久久久久久国产91| 亚洲国产一成人久久精品| 久久久久亚洲?V成人无码| 久久亚洲国产欧洲精品一| 欧美精品久久久久久久自慰| 欧美伊人久久大香线蕉综合69| aaa级精品久久久国产片| 天堂久久天堂AV色综合| 国产精品久久婷婷六月丁香| 精品久久久久久中文字幕大豆网| 情人伊人久久综合亚洲| 久久人人爽人人爽人人av东京热| 观看 国产综合久久久久鬼色 欧美 亚洲 一区二区 | 久久人人爽人人爽人人片av高请| 久久99国产一区二区三区| 情人伊人久久综合亚洲| 国产精品美女久久久久网| 99久久久精品| 中文字幕亚洲综合久久2| 7国产欧美日韩综合天堂中文久久久久 | 色综合久久中文字幕综合网|