• <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>

            羅朝輝(飄飄白云)

            關(guān)注嵌入式操作系統(tǒng),移動(dòng)平臺(tái),圖形開(kāi)發(fā)。-->加微博 ^_^

              C++博客 :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
              85 隨筆 :: 0 文章 :: 169 評(píng)論 :: 0 Trackbacks

            讓gcc支持成員函數(shù)模板的trick

            羅朝輝 (http://www.shnenglu.com/kesalin/)

            本文遵循“署名-非商業(yè)用途-保持一致”創(chuàng)作公用協(xié)議
             
            gcc 4.7.3 不支持成員函數(shù)模板特化。如下代碼:

            #ifndef __MEMFUNTEMPLATE_H__
            #define __MEMFUNTEMPLATE_H__

            #include <stdio.h>

            class Base {};
            class Derived : public Base {};

            struct Functor {
                template <typename T> void function() {
                    printf(" Primary template.\n");
                }

                template<>
                void function<int>(){
                    printf(" Specialization for int.\n");
                }

                template<> void function<Base *>() {
                    printf(" Specialization for Base *.\n");
                }
            };

            class Tester {
            public:
                static void DoTest()
                {
                    Functor functor;
                    functor.function<char>();
                    functor.function<int>();
                    functor.function<Base *>();
                    functor.function<Derived *>();
                }
            };

            #endif // __MEMFUNTEMPLATE_H__

            在 VS2010 中編譯運(yùn)行是沒(méi)有問(wèn)題的,但在 gcc 4.7.3下,編譯都通不過(guò):

            ../src/MemFunTemplate.h:21:14: error: <strong>explicit specialization in non-namespace scope</strong> ‘struct Functor’
            ../src/MemFunTemplate.h:22:24: error: template-id ‘function<int>’ in declaration of primary template
            ../src/MemFunTemplate.h:26:14: error: explicit specialization in non-namespace scope ‘struct Functor’
            ../src/MemFunTemplate.h:26:38: error: template-id ‘function<Base*>’ in declaration of primary template
            ../src/MemFunTemplate.h:26:21: error: ‘void Functor::function()’ cannot be overloaded
            ../src/MemFunTemplate.h:22:10: error: with ‘void Functor::function()’
            ../src/MemFunTemplate.cpp: In function ‘int main()’:
            ../src/MemFunTemplate.cpp:17:2: error: ‘DoTest’ is not a member of ‘Functor’


            為了達(dá)到近似成員函數(shù)模板特化的效果,可以利用成員函數(shù)主模板以及重載函數(shù)來(lái)實(shí)現(xiàn):


            /*
             * MemFunTemplate.h
             *
             *  Created on: Jul 12, 2013
             *      Author: http://blog.csdn.net/kesalin/
             */

            #ifndef MEMFUNTEMPLATE_H_
            #define MEMFUNTEMPLATE_H_
            #include <stdio.h>
            template<typename T>
            struct DummyIdentity {
                typedef T type;
            };
            class Base {};
            class Derived : public Base {};
            struct Functor {
                template <typename T> void function() {
                    function(DummyIdentity<T>());
                }
            private:
                template <typename T>
                void function(DummyIdentity<T>) {
                    printf(" Primary template DummyIdentity<T>.\n");
                }
                void function(DummyIdentity<int>) {
                    printf(" overload function for DummyIdentity<int>.\n");
                }
                void function(DummyIdentity<Base *>) {
                    printf(" overload function for DummyIdentity<Base *>.\n");
                }
            };
            class Tester {
            public:
                static void DoTest()
                {
                    Functor functor;
                    functor.function<char>();
                    functor.function<int>();
                    functor.function<Base *>();
                    functor.function<Derived *>();
                }
            };
            #endif /* MEMFUNTEMPLATE_H_ */


            調(diào)用 DoTest() 運(yùn)行結(jié)果如下:

             Primary template DummyIdentity<T>.
             overload function for DummyIdentity<int>.
             overload function for DummyIdentity<Base *>.
             Primary template DummyIdentity<T>.


            注意:

            VS2010 版本的代碼,模板形參為 T,在實(shí)例化不會(huì)進(jìn)行隱式類(lèi)型轉(zhuǎn)換。即用 Derived * 當(dāng)作實(shí)參調(diào)用的是主模板,而不是 Base * 特化版本

            而在 gcc  下,模板形參雖然也為T(mén),但影響重載決議的 function 參數(shù)為:DummyIdentity<T>,用不同的實(shí)際參數(shù)實(shí)例化該模板,得到的是一堆重載函數(shù)。因此用 Derived * 當(dāng)作實(shí)參時(shí),調(diào)用的函數(shù)自然就是實(shí)例化的 void function(DummyIdentity<T>)了。

             
            posted on 2013-07-12 22:04 羅朝輝 閱讀(6316) 評(píng)論(3)  編輯 收藏 引用 所屬分類(lèi): C/C++

            評(píng)論

            # re: 讓gcc支持成員函數(shù)模板的trick 2013-07-13 20:54 Marvin
            從objective-c轉(zhuǎn)到c++了?  回復(fù)  更多評(píng)論
              

            # re: 讓gcc支持成員函數(shù)模板的trick 2013-07-14 21:37 羅朝輝
            @Marvin
            哈哈,本就是從C++起家的~~  回復(fù)  更多評(píng)論
              

            # re: 讓gcc支持成員函數(shù)模板的trick 2014-08-15 21:28 acmol
            其實(shí)只需要
            a->template b()就可以調(diào)用了。。
            雖然我也不知道原因。  回復(fù)  更多評(píng)論
              

            亚洲AV成人无码久久精品老人| 久久亚洲AV无码精品色午夜麻豆| 偷偷做久久久久网站| Xx性欧美肥妇精品久久久久久| 日韩精品久久久久久久电影蜜臀| 亚洲国产精品狼友中文久久久| 99精品久久久久久久婷婷| 久久被窝电影亚洲爽爽爽| 精品永久久福利一区二区| 久久免费看黄a级毛片| 中文字幕乱码人妻无码久久| 2021国内久久精品| 久久久久国产精品人妻| 久久久久波多野结衣高潮| 亚洲国产成人精品91久久久| 理论片午午伦夜理片久久 | 久久综合中文字幕| 国产精品99久久免费观看| 9久久9久久精品| 狠狠色婷婷综合天天久久丁香 | 久久精品九九亚洲精品| 色婷婷久久综合中文久久蜜桃av| 亚洲国产精品久久电影欧美| 久久精品亚洲日本波多野结衣| 久久久久国产精品熟女影院 | 性欧美大战久久久久久久| 亚洲国产婷婷香蕉久久久久久| 亚洲国产成人精品女人久久久 | 亚洲Av无码国产情品久久| 伊人久久大香线蕉精品不卡| 久久精品国产AV一区二区三区| 亚洲中文字幕无码一久久区| AAA级久久久精品无码片| 国产精品伦理久久久久久| 亚洲国产高清精品线久久 | 亚洲国产欧美国产综合久久| 精品久久久久久国产潘金莲| 久久99精品久久久久久齐齐| 久久亚洲国产成人影院| 日产精品久久久一区二区| 1000部精品久久久久久久久|