template函式模板

2021-09-08 16:22:42 字數 1458 閱讀 5010

模板(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 過載的模板

需要多個對不用型別使用同一種演算法的函式時,可使用模板。如上篇程式所示鏈結。然而,並非所有的型別都使用相同的演算法。為滿足這種需求,可以像過載常規函式定義那樣過載模板定義。和常規過載一樣,被過載的模板的函式特徵標必須不同。例如,下面的程式新增了乙個交換模板,用於交換兩個陣列中的元素。原來的模板的特徵...