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來形成不同的重載函數
第一個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的形參。
還是來個簡單的例子
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的作用與函數模板一致。不同的是:
C++中模板的基本使用方法如上。下一篇博客將帶大家進入模板特化以及深入解釋上述例子無法編譯的原因。
轉載于:https://www.cnblogs.com/suimeng/p/4905607.html
總結
以上是生活随笔為你收集整理的C++模板详解——使用篇的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ARM Cortex Debug Por
- 下一篇: 联想thinkpad笔记本怎么重装系统