C 模板詳解 使用篇

2022-03-11 18:37:58 字數 3177 閱讀 1511

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

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)

template告訴編譯器這是乙個模板,緊跟在後面的<>中宣告了模板形參,這些形參在模板中可以充當型別,宣告可以選用class或者typename,暫時認為兩者在c++中作用相同。普通函式的形參為乙個變數,模板形參為一種變數型別。也就是,我們可以通過指定模板形參的型別。來個簡單的例子。

比如int,float來形成不同的過載函式

template < class type...>

type max(type fir,type sec...)

void main()

第乙個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)

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

在模板形參中,我們可以隨意地定義任意數量的模板形參,但必須保證能夠全部初始化。

使用了不同的型別名type_1,type_2...意味著我們可以指定多種型別的模板形參,其型別也可以不相同。

模板形參沒有要求必須與普通函式形參一一對應,即在形參中的順序可以隨意打亂,其型別由相應的普通形參的型別決定。如,type_1的型別由sec的型別決定。

在模板函式中,除了模板形參外,可以使用內建的或者自定義的型別。

還是來個簡單的例子

template < class type_1,class type_2>

void max(type_2 fir,type_1 sec,int)//最後的引數沒有使用,可以直接忽略形參名

void main()

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

在呼叫模板函式的時候,我們可以通過直接指定模板形參的型別從而阻止普通函式形參對於模板形參的影響。但是,指定的型別與普通函式形參必須能夠進行型別轉換。

比如,內建型別的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

student(type_1 fir,type_2 sec){}

student(type_1 fir){}

private:

type_1 value_1;

type_2 value_2;

...};void main()

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

類模板必須在使用的時候指定好模板形參的型別,編譯器不會通過public介面,包括建構函式去作為模板形參型別的辨別依據。記得vectorvec吧,沒見過vector vec(1)吧。

使用類模板的時候,使用到的成員函式在主調語句必須可見。比如,上述的student(type_1 fir,type_2 sec)在main中呼叫,其函式定義在main所在檔案必須可見。再比如上述例子,假如其實現分配到如下幾個檔案,在鏈結的時候將出錯。讀者可以先記得,在「精通篇」會詳細闡述這一點。

類模板中,慎用模板形參過載函式。上述的例子中,假如再增加student(type_2)就會編譯出錯。編譯器無法在student(type_1)與student(type_2)中做抉擇。

template < class type_1,class type_2>

class student

student(type_1 fir,type_2 sec);

private:

...};

#include"1.h"

student< class type_1,class type_2>::student()

{}#include"1.h"

void main()

C 類模板使用詳解

1.模板的概念。我們已經學過過載 overloading 對過載函式而言,c 的檢查機制能通過函式引數的不同及所屬類的不同。正確的呼叫過載函式。例如,為求兩個數的最大值,我們定義max 函式需要對不同的資料型別分別定義不同過載 overload 版本。函式1.int max int x,int y ...

C 中模板使用詳解

1.模板的概念。我們已經學過過載 overloading 對過載函式而言,c 的檢查機制能通過函式引數的不同及所屬類的不同。正確的呼叫過載函式。例如,為求兩個數的最大值,我們定義max 函式需要對不同的資料型別分別定義不同過載 overload 版本。函式1.int max int x,int y ...

C 中模板使用詳解

1.模板的概念。我們已經學過過載 overloading 對過載函式而言,c 的檢查機制能通過函式引數的不同及所屬類的不同。正確的呼叫過載函式。例如,為求兩個數的最大值,我們定義max 函式需要對不同的資料型別分別定義不同過載 overload 版本。函式1.int max int x,int y ...