中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C++模板使用實例分析

發布時間:2022-04-15 13:51:22 來源:億速云 閱讀:131 作者:iii 欄目:開發技術

這篇文章主要介紹了C++模板使用實例分析的相關知識,內容詳細易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇C++模板使用實例分析文章都會有所收獲,下面我們一起來看看吧。

    非類型模板參數

    模板參數分類類型形參與非類型形參。

    類型形參:出現在模板參數列表中,跟在class或者typename之類的參數類型名稱。

    非類型形參,就是用一個常量作為類(函數)模板的一個參數,在類(函數)模板中可將該參數當成常量來使用。

    注意:

    • 浮點數,類對象以及字符串是不允許作為非類型模板的。

    • 非類型的模板參數必須在編譯期就能確認結果。

    模板特化

    有時候,編譯默認函數模板或者類模板不能正確處理需要邏輯,需要針對一些情況特殊化處理,就要做模板特化。

    通常情況下,使用模板可以實現一些與類型無關的代碼,但對于一些特殊類型的可能會得到一些錯誤的結果,例如:

    template<class T>
    bool IsEqual(const T&left,const T&right)
    {
        return left==right;
    }
    //針對字符串類型要特殊化處理--寫一份函數模板的特殊化出來
    template<>
    bool IsEqual<char*>(const char* &left,const char* &right)
    {
        return strcmp(left,right)==0;
    }
    
    int main()
    {
        cout<<IsEqual(1,2)<<endl;//0
        cout<<IsEqual(1.1,1.1)<<endl;//1
        
        char p1[]="hello";
        char p2[]="hello";
        cout<<IsEqual(p1,p2)<<endl;//0
        
        const char* p3="hello";
        const char* p4="hello";
        cout<<IsEqual(p3,p4)<<endl;//1
    }

    此時,就需要對模板進行特化。即:在原模板類的基礎上,針對特殊類型所進行特殊化的實現方式。模板特化中分為函數模板特化與類模板特化。

    特化的本質:顯示指定實例化的模板

    函數模板特化

    函數模板特化步驟

    • 必須要先有一個基礎的函數模板

    • 關鍵字template后面接一對空的尖括號<>

    • 函數名后跟一對尖括號,尖括號中指定需要特化的類型

    • 函數形參表: 必須要和模板函數的基礎參數類型完全相同,如果不同編譯器可能會報一些奇怪的錯誤

    template<>
    bool IsEqual<const char* const>(const char* const &left,const char* &right)
    {
        if(strcmp(left,right)>0)
            return true;
        return false;
    }

    注意:一般情況下如果函數模板遇到不能處理或者處理有誤的類型,為了實現簡單通常都是將該函數直接給出。

    類模板特化

    全特化

    全特化既是將模板參數列表中所有的參數都確定化

    template<calss T1,class T2>
    class Data
    {
    public:
        Data(){cout<<"Data<T1,T2>"<<endl; }
    private:
              T1 _d1;
              T2 _d2;
    };
    
    template<>
    class Data<int ,char>
    public:
        Data(){cout<<"Data<int,char>"<<endl; }
    private:
              int _d1;
              char _d2;
    };
    void TestVector()
    {
        Data<int,int>d1;
        Data<int,char>d2;
    }
    偏特化

    針對任何模板參數進一步進行條件限制設計的特化版本,比如對于一下模板類:

    template<class T1,class T2>
    class Data
    {
    public:
        Data(){cout<<"Data<T1,T2>"<<endl;}
    private:
        T1 _d1;
        T2 _d2;
    };
    //偏特化有以下兩種表現方式:
    //1、部分特化:將函數中的一部分參數特化。
    
    template<class T1>
    class Data<T1,int>
    {
    public:
        Data(){cout<<"Data<T1,int>"<<endl;}
    private:
        T1 _d1;
        int _d2;
    }
    //2、參數進一步的限制:偏特化并不僅僅是指特化部分參數,而是針對模板參數更進一步的條件限制所設計出來的一個特化版本
    //兩個參數偏特化為指針類型
    template<typename T1,typename T2>
    class Data<T1*,T2*>
    {
    public:
        Data(){cout<<"Data<T1*,T2*>"<<endl;}
    private:
        T1* _d1;
        T2* _d2;
    };
    //兩個參數偏特化為引用類型
    template<typename T1,typename T2>
    class Data<T1&,T2&>
    {
    public:
        Data(){cout<<"Data<T1&,T2&>"<<endl;}
    private:
        const T1& _d1;
        const T2& _d2;
    };
    
    void test2()
    {
        Data<double,int>d1;   //調用特化的int版本
        Data<int,double>d2;   //調用基礎模板
        Data<int *,int*>d3;   //調用特化的指針版本
        Data<int&,int&>d4(1,2); //調用特化的引用版本
    }

    模板分離編譯

    分離編譯就是指一個程序由若干個源文件共同實現,而每個源文件單獨編譯生成目標文件,最后將目標文件連接起來形成單一的可執行文件的過程稱為分離編譯模式。

    模板的分離編譯
    // a.h
    template<class T>
    T Add(const T& left, const T& right);
    // a.cpp
    template<class T>
    T Add(const T& left, const T& right)
    {
        return left + right;
    }
    // main.cpp
    #include"a.h"
    int main()
    {
        Add(1, 2);
        Add(1.0, 2.0);
        return 0;
    }

    分析:

    C++模板使用實例分析

    解決方法
    • 將聲明和定義放到一個文件中。推薦使用

    • 模板定義的位置顯示實例化。不實用

    關于“C++模板使用實例分析”這篇文章的內容就介紹到這里,感謝各位的閱讀!相信大家對“C++模板使用實例分析”知識都有一定的了解,大家如果還想學習更多知識,歡迎關注億速云行業資訊頻道。

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    c++
    AI

    高淳县| 若羌县| 七台河市| 微山县| 仁布县| 水富县| 大竹县| 绍兴县| 武安市| 额敏县| 织金县| 宁安市| 弥渡县| 阜宁县| 钟山县| 宁夏| 基隆市| 威远县| 宝坻区| 昌乐县| 绥芬河市| 襄城县| 仁怀市| 东港市| 茌平县| 卢氏县| 全椒县| 仙居县| 手机| 乌苏市| 潜江市| 洞口县| 伊春市| 布尔津县| 乐都县| 中方县| 磴口县| 北川| 漳州市| 南皮县| 神农架林区|