<P>函數(shù)模板就是一個函數(shù)的模板,其中函數(shù)定義中的類型并不是實際類型,編譯器可以根據(jù)函數(shù)模板和相應(yīng)的實際類型來產(chǎn)生函數(shù)的實例(也就是函數(shù))。</P>2 [, f, J' y2 k* B
<P><FONT color=#0000ff>重載函數(shù)模板</FONT>與重載函數(shù)有聯(lián)系,因為都是重載,但這里重載的是函數(shù)模板,也就是把模板中的(形式)類型用相應(yīng)的實際類型來重載,即<FONT color=#ff0000>聲明一個某種類型的顯式函數(shù)模板</FONT>----這樣的模板中的類型就是實際類型了,當(dāng)然,原來一樣的類型這里也應(yīng)重載為同樣類型。這就可以方便地使用函數(shù)模板來處理隱式類型轉(zhuǎn)換的情況了。</P>/ l" k- [) g% z( J
<P>C++在匹配函數(shù)時遵循以下約定(也就是調(diào)用函數(shù)的"優(yōu)先級"):</P>
- Y# X0 q' u* X6 J2 s1 N$ f<P><FONT color=#003399>(1)尋找一個參數(shù)完全匹配的函數(shù),如有就用它。但是如果有多于一個這樣的函數(shù)就返回出錯信息。</FONT></P>( p- e2 ^' M3 e
<P><FONT color=#003399>(2)尋找函數(shù)模板,把它實例化成一個匹配的模板函數(shù),如果找到了,就調(diào)用它。</FONT></P>$ n3 D* _) r& v$ H3 K
<P><FONT color=#003399>(3)如果有一個函數(shù)經(jīng)過隱式類型轉(zhuǎn)換可使所給參數(shù)匹配的話,就調(diào)用它。</FONT></P>" a1 k, |, ?) q# Z e
<P><FONT color=#003399>(4)用上面的方法都找不到可調(diào)用函數(shù)時,返回出錯信息。</FONT></P>
" j; G; @! w4 @1 |/ }- A, }% v<P><FONT color=#0000ff>函數(shù)模板的處理方法</FONT>:為了能使編譯器在使用模板之間就"看到"模板,就要把它放在使用模板函數(shù)的程序段之前,所以為了確保"萬無一失"并使程序簡潔,一般<FONT color=#ff0000>將函數(shù)模板的聲明及其實現(xiàn)存為一個頭文件</FONT>,然后在程序中包含它就可以了。</P>
; G9 b' K& C. I5 I" k2 X' e<P><FONT color=#0000ff>特定的模板函數(shù)</FONT>:有時,模板實例化為某種類型的函數(shù)會產(chǎn)生錯誤的結(jié)果,比如在用指針類型作模板的參數(shù)時。這時就要另外定義一個函數(shù)實例,來對這種類型的數(shù)據(jù)進(jìn)行相應(yīng)處理。這個函數(shù)是專門用來<FONT color=#0000ff>替換</FONT>模板產(chǎn)生的<FONT color=#0000ff>實例的</FONT>,所以叫做<FONT color=#0000ff>特定模板函數(shù)</FONT>。有了這樣的函數(shù),C++編譯器就優(yōu)先調(diào)用它從而使模板不會產(chǎn)生這種類型的函數(shù)實例。這和重載函數(shù)模板不同,重載函數(shù)模板重載的是模板而不是模板產(chǎn)生的實例(即函數(shù)) 。 </P>" Y" ]% y' x: k w$ |
<P>有幾個術(shù)語要區(qū)別開來,<FONT color=#0000ff>函數(shù)模板是模板聲明</FONT>,<FONT color=#0000ff>模板函數(shù)是模板實例</FONT>,<FONT color=#0000ff>特定模板函數(shù)則是替換模板實例</FONT>。</P>
, Q+ R: |, r+ ~2 F* g<P>對于這一段內(nèi)容,相應(yīng)的<FONT color=#0000ff>實際運(yùn)用</FONT>應(yīng)該熟練掌握。</P> |