template(轉)

//參考  http://prglab.com/cms/pages/c-tutorial/advanced-concepts/templates.php

函數模板( Function templates)

模板是通用語言的特性,模板又叫參數化類型(parametrized types)。利用模板機制可以顯著減少冗餘信息,能大幅度地節約程序代碼,進一步提高面向對象程序的可重用性和維護性

模板(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 來代替一樣。

 

這裏是2個例子:

1 template <class any>//class 也可以換成typename,後者是新來的。

  void swap(any &a,any &b)

  {

  ......

  }

 

2// 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

(在這個例子中,我們將通用數據類型命名爲而不是 GenericType ,因爲T短一些,並且它是模板更爲通用的標示之一,雖然使用任何有效的標示符都是可以的。)

 

在上面的例子中,我們對同樣的函數GetMax()使用了兩種參數類型:int  long,而只寫了一種函數的實現,也就是說我們寫了一個函數的模板,用了兩種不同的pattern來調用它。

如你所見,在我們的模板函數 GetMax() 裏,類型 T 可以被用來聲明新的對象   T result;

result 是一個T類型的對象,就像 b一樣,也就是說,它們都是同一類型的,這種類型就是當我們調用模板函數時寫在尖括號<> 中的類型。

 

template <class T> // 最常用的:一個class 參數。

template <class T, class U> // 兩個class 參數。

template <class T, int N> // 一個class 和一個整數。

template <class T = char> // 有一個默認值。

template <int Tfunc (int)> // 參數爲一個函數。

 

在函數模板中允許使用多個類型參數。但是應當注意template定義部分的每個類型參數前必須有關鍵字函數模板的異常處理。函數模板有一個特點,雖然函數模板中德類型參數T可以實例化爲各種類型,但是採用類型參數T的每個參數必須實例化成完全相同的類型。模板類型不具有隱式的類型轉換。如果不注意這一點,可能產生錯誤

轉自:http://blog.csdn.net/longjing1113/article/details/8807570

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章