模板(templates)使得我們可以生成通用的函式,這些函式能夠接受任意資料型別的引數,可返回任意型別的值,而不需要對所有可能的資料型別進行函式過載。這在一定程度上實現了巨集(macro)的作用。它們的原型定義可以是下面兩種中的任何乙個:
template function_declaration;
template function_declaration;
上面兩種原型定義的不同之處在關鍵字class 或 typename的使用。它們實際是完全等價的,因為兩種表達的意思和執行都一模一樣。
例如,要生成乙個模板,返回兩個物件中較大的乙個,我們可以這樣寫:
template
generictype getmax (generictype a, generictype b)
在第一行宣告中,我們已經生成了乙個通用資料型別的模板,叫做generictype。因此在其後面的函式中,generictype 成為乙個有效的資料型別,它被用來定義了兩個引數a和 b ,並被用作了函式getmax的返回值型別。
generictype 仍沒有代表任何具體的資料型別;當函式 getmax 被呼叫的時候,我們可以使用任何有效的資料型別來呼叫它。這個資料型別將被作為pattern來代替函式中generictype 出現的地方。用乙個型別pattern來呼叫乙個模板的方法如下:
function (parameters);
例如,要呼叫getmax 來比較兩個int型別的整數可以這樣寫:
int x,y;
getmax (x,y);
因此,getmax 的呼叫就好像所有的generictype 出現的地方都用int 來代替一樣。
這裡是乙個例子:
// function template
#include
template t getmax (t a, t b) 610
(在這個例子中,我們將通用資料型別命名為t 而不是 generictype ,因為t短一些,並且它是模板更為通用的標示之一,雖然使用任何有效的標示符都是可以的。)
在上面的例子中,我們對同樣的函式getmax()使用了兩種引數型別:int 和 long,而只寫了一種函式的實現,也就是說我們寫了乙個函式的模板,用了兩種不同的pattern來呼叫它。
如你所見,在我們的模板函式 getmax() 裡,型別 t 可以被用來宣告新的物件
t result;
result 是乙個t型別的物件, 就像a 和 b一樣,也就是說,它們都是同一型別的,這種型別就是當我們呼叫模板函式時寫在尖括號<> 中的型別。
template // 最常用的:乙個class 引數。
template // 兩個class 引數。
template // 乙個class 和乙個整數。
template // 有乙個預設值。
template // 引數為乙個函式。
template函式模板
模板 templates 使得我們可以生成通用的函式,這些函式能夠接受任意資料型別的引數,可返回任意型別的值,而不需要對所有可能的資料型別進行函式過載。這在一定程度上實現了巨集 macro 的作用。它們的原型定義可以是下面兩種中的任何乙個 template function declaration ...
swap函式 template 函式模板
template是c 裡面的關鍵字 還是接著上次的swap函式入手 一叉樹 從c語言到c zhuanlan.zhihu.com 現在想交換的是兩個int變數和兩個double變數 using namespace std int main void swap2 double a,double b 這兩...
函式模板template 過載的模板
需要多個對不用型別使用同一種演算法的函式時,可使用模板。如上篇程式所示鏈結。然而,並非所有的型別都使用相同的演算法。為滿足這種需求,可以像過載常規函式定義那樣過載模板定義。和常規過載一樣,被過載的模板的函式特徵標必須不同。例如,下面的程式新增了乙個交換模板,用於交換兩個陣列中的元素。原來的模板的特徵...