學學習網 手機版

學學習網

學習路徑: 學習首頁 > 應用開發 > c++ >

第七節 模板(Templates)

設置字體:
----------------------------------
模板(Templates)是ANSI-C++ 標準中新引入的概念。如果你使用的 C++ 編譯器不符合這個標準,則你很可能不能使用模板。
 
 
函數模板( Function templates)
模板(Templates)使得我們可以生成通用的函數,這些函數能夠接受任意數據類型的參數,可返回任意類型的值,而不需要對所有可能的數據類型進行函數重載。這在一定程度上實現了宏(macro)的作用。它們的原型定義可以是下面兩種中的任何一個:
template <class identifier> function_declaration;
template <typename identifier> function_declaration;
上面兩種原型定義的不同之處在關鍵字class 或 typename的使用。它們實際是完全等價的,因為兩種表達的意思和執行都一模一樣。
例如,要生成一個模板,返回兩個對象中較大的一個,我們可以這樣寫:
template <class GenericType>
GenericType GetMax (GenericType a, GenericType b) { return (a>b?a:b); }
在第一行聲明中,我們已經生成了一個通用數據類型的模板,叫做GenericType。因此在其后面的函數中,GenericType 成為一個有效的數據類型,它被用來定義了兩個參數a和 b ,并被用作了函數GetMax的返回值類型。
GenericType 仍沒有代表任何具體的數據類型;當函數 GetMax 被調用的時候,我們可以使用任何有效的數據類型來調用它。這個數據類型將被作為pattern來代替函數中GenericType 出現的地方。用一個類型pattern來調用一個模板的方法如下:
function <type> (parameters);
例如,要調用GetMax 來比較兩個int類型的整數可以這樣寫:
int x,y;
GetMax <int> (x,y);
因此,GetMax 的調用就好像所有的GenericType 出現的地方都用int 來代替一樣。
這里是一個例子:
// function template
#include <iostream.h>
template <class T> T GetMax (T a, T b) {
    T result;
    result = (a>b)? a : b;
    return (result);
}
int main () {
    int i=5, j=6, k;
    long l=10, m=5, n;
    k=GetMax(i,j);
    n=GetMax(l,m);
    cout << k << endl;
    cout << n << endl;
    return 0;
}
6
10
(在這個例子中,我們將通用數據類型命名為T 而不是 GenericType ,因為T短一些,并且它是模板更為通用的標示之一,雖然使用任何有效的標示符都是可以的。)
在上面的例子中,我們對同樣的函數GetMax()使用了兩種參數類型:int 和 long,而只寫了一種函數的實現,也就是說我們寫了一個函數的模板,用了兩種不同的pattern來調用它。
如你所見,在我們的模板函數 GetMax() 里,類型 T 可以被用來聲明新的對象
T result;
result 是一個T類型的對象, 就像a 和 b一樣,也就是說,它們都是同一類型的,這種類型就是當我們調用模板函數時寫在尖括號<> 中的類型。
在這個具體的例子中,通用類型 T 被用作函數GetMax 的參數,不需要說明<int>或 <long>,編譯器也可以自動檢測到傳入的數據類型,因此,我們也可以這樣寫這個例子:
int i,j;
GetMax (i,j);
因為i 和j 都是int 類型,編譯器會自動假設我們想要函數按照int進行調用。這種暗示的方法更為有用,并產生同樣的結果:
// function template II
#include <iostream.h>
template <class T> T GetMax (T a, T b) {
    return (a>b?a:b);
}
int main () {
    int i=5, j=6, k;
    long l=10, m=5, n;
    k=GetMax(i,j);
    n=GetMax(l,m);
    cout << k << endl;
    cout << n << endl;
    return 0;
}
6
10
注意在這個例子的main() 中我們如何調用模板函數GetMax() 而沒有在括號<>中指明具體數據類型的。編譯器自動決定每一個調用需要什么數據類型。
因為我們的模板函數只包括一種數據類型 (class T), 而且它的兩個參數都是同一種類型,我們不能夠用兩個不同類型的參數來調用它:
----------------------------------
課程列表
重點難點
贊助鏈接
倾国妲己官网