日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

C++模板详解——使用篇

發布時間:2025/5/22 c/c++ 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++模板详解——使用篇 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

假如我們需要取得兩個變量中較大的變量,或許,我們可以通過重載的方式實現,如下。

int max(int fir,int sec); float max(float fir,float sec); double max(double fir,double sec);

有一天,我們定義了一個新的type,School,取決于max的實現,我們不僅需要重載School::operator<(), 或者School::operator>()還要重載一個新的max

const School max(School& fir,School& sec);

使用C++的模板,從此告別這些繁瑣而又略顯臃腫的代碼。

注:1. 上述的返回值可以考慮使用const School&,但一般不建議,參見在返回值拒絕reference
2.形參使用了School&,參見傳參時,使用引用替換變量

函數模板

顧名思義,模板,也就是“模板”,并不是實際存在的東西,而只是為了讓我們更方便地生產某些東西的模具。C++的模板分為了兩類,類模板與函數模板。分別用于讓我們方便地“生產各種各樣的函數與類”,它們都使用了template,class,typename幾個關鍵字。為什么說是各種各樣,看完了博客自然就明白了。下面介紹函數模板。

示例

template < class type> type max(type fir,type sec) {return fir > sec ? fir : sec; }

template告訴編譯器這是一個模板,緊跟在后面的<>中聲明了模板形參,這些形參在模板中可以充當類型,聲明可以選用class或者typename,暫時認為兩者在C++中作用相同。普通函數的形參為一個變量,模板形參為一種變量類型。也就是,我們可以通過指定模板形參的類型。來個簡單的例子。
比如int,float來形成不同的重載函數

template < class type...> type max(type fir,type sec...) {return fir > sec ? fir : sec; } void main() {int a(1),b(2);float c(1),d(2);max(a,b); //具現化int max(int fir,int sec);max(c,d); //具現化int max(float fir,float sec); }

第一個max使用了int類型的參數,相當于告訴函數模板,type對應于int,在具現化的函數模板中,type的作用相當于int。所以具現化的函數相當于int
max(int fir,int sec);相對應地,使用了float調用函數模板,也就是制定了type為float,與前一個函數形成了重載。

注:雖然float能夠隱私轉換為int,但是還是會具現化新的函數。只有當前的參數類型與已經具現化的函數模板完全匹配的時候,才會繼續使用已經具現化的函數。

拓展

template < class type_1,class type_2...> type_1 func(type_2 fir,type_1 sec,int thir) {//return... }

相對于前一個模板函數,這個模板函數的模板形參數量增加了,在普通的形參列表中,模板形參的順序打亂了,還增加了int的形參。

  • 在模板形參中,我們可以隨意地定義任意數量的模板形參,但必須保證能夠全部初始化。
  • 使用了不同的類型名type_1,type_2...意味著我們可以指定多種類型的模板形參,其類型也可以不相同。
  • 模板形參沒有要求必須與普通函數形參一一對應,即在形參中的順序可以隨意打亂,其類型由相應的普通形參的類型決定。如,type_1的類型由sec的類型決定。
  • 在模板函數中,除了模板形參外,可以使用內置的或者自定義的類型。
  • 還是來個簡單的例子

    template < class type_1,class type_2> void max(type_2 fir,type_1 sec,int)//最后的參數沒有使用,可以直接忽略形參名 {std::cout<<fir<<"+"<<sec<<endl; } void main() {int a(1);float b(1.0);max(a,b,1); //1. 具現化void max(int fir,float sec,int); }

    第一個實參為int型,其對應的形參是type_2,所以type_2具現化后就是int。

    第二個實參為float,其對應的形參type_1,所以type_1具現化后就是float。最后的具現化的函數就是int max(int fir,float sec,int);

    指定參數類型

    還記得使用STL容器的方法嗎,比如定義一個vector類型的容器。STL也叫作標準模板庫,也就是其內部也是通過模板實現的,所以這種名稱后加類型名的方法對我們也同樣適用。

    void Select(int a) {std::cout<<"是int型"<<endl; } void Select(float a) {std::cout<<"是float型"<<endl; } template < class type_1,class type_2> void myPrint(type_1 fir,type_2 sec) {Select(fir); } void main() {myPrint(1.0,1); //輸出"是float型"myPrint<int>(1.0,1); //輸出"是int型" }

    在上面的例子中,我們可以發現:

  • 在調用模板函數的時候,我們可以通過直接指定模板形參的類型從而阻止普通函數形參對于模板形參的影響。但是,指定的類型與普通函數形參必須能夠進行類型轉換。
  • 比如,內置類型的int與double可以相互轉換,所以myPrint< double>(1)可用。但是string與int之間不可相互轉換myPrint< string>(1)就沒辦法通過編譯。假如我們定義了class My,其構造函數為public:My(int),那么認為My與int可以相互轉換(本質上是隱式調用了My的構造函數),myPrint< My>(1)就可以通過編譯。

    類模板

    假如你對函數模板還不會使用,請自行回顧,一些函數模板講過的在下面不再贅述。

    實例

    template < class type_1,class type_2> class Student { public:Student(){}Student(type_1 fir,type_2 sec){}Student(type_1 fir){} private:type_1 value_1;type_2 value_2;... }; void main() {Student stu(1,1); //errorStudent<int,float> stu(1,1); //OK }

    template,class的作用與函數模板一致。不同的是:

  • 類模板必須在使用的時候指定好模板形參的類型,編譯器不會通過public接口,包括構造函數去作為模板形參類型的辨別依據。記得vector vec吧,沒見過vector vec(1)吧。
  • 使用類模板的時候,使用到的成員函數在主調語句必須可見。比如,上述的Student(type_1 fir,type_2 sec)在main中調用,其函數定義在main所在文件必須可見。再比如上述例子,假如其實現分配到如下幾個文件,在鏈接的時候將出錯。讀者可以先記得,在“精通篇”會詳細闡述這一點。
  • 類模板中,慎用模板形參重載函數。上述的例子中,假如再增加Student(type_2)就會編譯出錯。編譯器無法在Student(type_1)與Student(type_2)中做抉擇。
  • //1.h template < class type_1,class type_2> class Student { public:...Student() //有具體實現的構造函數{...}Student(type_1 fir,type_2 sec); private:... }; //1.cpp #include"1.h" Student< class type_1,class type_2>::Student() {} //core.cpp #include"1.h" void main() {Student<int,int> stu(1,1); //構造函數定義在1.cpp中,不可見,出錯Student<int,int> stu(); //默認構造函數隨1.hinclude,可見,編譯通過 }

    C++中模板的基本使用方法如上。下一篇博客將帶大家進入模板特化以及深入解釋上述例子無法編譯的原因。

    轉載于:https://www.cnblogs.com/suimeng/p/4905607.html

    總結

    以上是生活随笔為你收集整理的C++模板详解——使用篇的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。