函式模板:
所謂函式的模板,本質上也就是使用泛型來定義函式。
所謂的泛型其實也就是不定的型別,比如說我們使用vector的時候,可以定義各種型別的vector,可以定義儲存int型的vector也可以定義儲存float型別的,也可以定義儲存其他型別。我們在宣告的時候將儲存的型別當做引數傳給了模板。
泛型可以用具體的型別,比如(int或double)替換,通過將型別作為引數傳給模板,編譯器會根據傳遞的引數型別生成該型別的函式。這種方式也被稱為通用程式設計或者引數ivjgtsgk化型別。
舉乙個很簡單的例子,比如說我們要實現乙個函式交換兩個變數的值。對於int型別我們要實現一遍,對於double型別我們又要實現一遍,如果還需要其他型別,那麼又需要額外實現很多同樣邏輯的函式。當然可以拷貝**,但顯然這樣會很浪費時間,而且會使得**變得臃腫。
這個時候我們就可以使用函式模板自動完成這一功能,函式模板允許以任意型別來定義函式,所以我們就可以這樣實現:
template
void swap(t &a, t &b)
當我們要建立乙個模板的時候,需要首程式設計客棧先宣告模板的型別,也就是template語句做的事情。關鍵字typename也是必須的,也可以使用class代替。typename關鍵字是在c++98標準新增的,所以在更早的版本中往往使用class。在這個場景下,這兩種方式是等價的。c++ primer當中更建議使用typename而非class。
typename之後跟的是型別的名稱,我們可以使用任意的名字,一般來說習慣性地會使用字母t。我們在使用的時候和普通函式並沒有什麼不同,當做普通函式使用即可。
template
void swap(t &a, t &b)
int i = 10, j = 20;
swap(i, j);
double a = 3.0, b = 4.0;
swap(a, b);
雖然我們只實現了一次函式,但是在編譯的時候,編譯器會將這個函式根據我們使用的情況生成多個版本。比如在程式設計客棧上面的**當中,我們使用了int和double兩種型別的函式。編譯器會替我們生成兩份**,也就是說最終**上和我們手動實現函式過載是一樣的,可以理解成一種方便我們程式編寫的特性。
c 函式模板
include using namespace std template t max t a,t b,t c int main int main int i1 185,i2 76,i3 567,i double d1 56.63,d2 90.23,d3 3214.78,d long g1 67854...
c 函式模板
關鍵字template總是放在模板的電腦關於與宣告的最前面,關鍵字後面是用逗號分隔的模板參數列,該列表是模板參數列,不能為空。模板引數可以是乙個模板型別引數,它代表了一種型別 也可以是乙個模板非型別引數,它代表了乙個常量表示式。模板型別引數由關鍵字class或typename後加乙個識別符號構成。在...
C 函式模板
c 提供了函式模板 function template 所謂函式模板,實際上是建立乙個通用函式,其函式型別和形參型別不具體指定,用乙個虛擬的型別來代表。這個通用函式就稱為函式模板。凡是函式體相同的函式都可以用這個模板來代替,不必定義多個函式,只需在模板中定義一次即可。在呼叫函式時系統會根據實參的型別...