C 函式模板

2021-07-30 23:58:38 字數 1319 閱讀 3868

》函式模板

template《模板形參表》《函式宣告》

其中的《模板形參表》由乙個或多個《模板形參》組成,多個《模板形參》之間用逗號隔開。每個《模板形參》具有下面幾種形式:

#   typename 《引數名》

#   class 《引數名》

#   《型別修飾》 《引數名》

這裡的《引數名》可以是任意的識別符號。在這三種形式中,前兩種是等價的:在宣告模板引數時,關鍵字typename與class可以互換。用typename或class宣告的引數稱為虛擬型別引數;而用《型別修飾》宣告的引數則稱為常規引數,在形式上與普通的函式引數宣告相同。

《函式宣告》與一般函式的宣告類似,只是某些型別修飾符被虛擬型別引數所替代。

示 例:

template

void addto(t a,t b,int size),y=;

addto(x,y,5);

這兩個語句時,會生成如下的函式例項:

void addto(long double a,long double b,int size),y=;

addto(x,y,9);

這兩個語句時,會生成:

void addto(unsigned a,unsigned b,int size){

for(int i=0;i例項化的過程或結果通常是看不見的,編譯系統會根據函式呼叫的具體情況自動傳遞相應的模板實參,生成相應的函式例項。

函式模板的模板形參表中可以有多個引數。例:addto模板也可以定義如下:

template

void addto(t1 a,t2 b,int size){

for(int i=o;i這個模板允許兩個陣列可以有不同的型別,例如乙個int乙個double。

在前面的addto例子中,對模板函式的呼叫只使用了函式實參,省略了模板實參。但模板實參的省略並不是必然的,而是有條件的。

在呼叫乙個模板函式時,編譯系統需要足夠的資訊來判別每個虛擬型別引數所對應的實際型別,可以從兩個不同的渠道獲得這樣的資訊:從模板實參表(用<>括起來的參數列) 或從模板函式實參表(用()括起來的參數列),模板實參的資訊優先於函式實參的資訊。 如果後者獲得的資訊已經能夠判定其中部分或全部虛擬型別引數所對應的實際引數,而且它們又正好是參數列中最後的若干引數,則模板實參表中的那幾個引數可以省略。如果模板實參表中的實參都被省略了,則連空表<>也可以不要。因此,若x和y都是unsigned型,則addto(x,y,9)    addto<>(x,y,9)    addto(x,y,9)三者是等價的。反之,對於某個模板實參,如果從模板函式的實參表中無法獲得同樣的資訊,就不能省略;或者雖然能夠獲得同樣的資訊,但在它後面還有其他不能省略的實參,則其自身還是不能省略。

c 函式模板

include using namespace std template t max t a,t b,t c int main int main int i1 185,i2 76,i3 567,i double d1 56.63,d2 90.23,d3 3214.78,d long g1 67854...

c 函式模板

關鍵字template總是放在模板的電腦關於與宣告的最前面,關鍵字後面是用逗號分隔的模板參數列,該列表是模板參數列,不能為空。模板引數可以是乙個模板型別引數,它代表了一種型別 也可以是乙個模板非型別引數,它代表了乙個常量表示式。模板型別引數由關鍵字class或typename後加乙個識別符號構成。在...

C 函式模板

c 提供了函式模板 function template 所謂函式模板,實際上是建立乙個通用函式,其函式型別和形參型別不具體指定,用乙個虛擬的型別來代表。這個通用函式就稱為函式模板。凡是函式體相同的函式都可以用這個模板來代替,不必定義多個函式,只需在模板中定義一次即可。在呼叫函式時系統會根據實參的型別...