c 函式模板

2021-09-19 13:18:02 字數 2129 閱讀 1746

前言:這裡僅介紹c++primer plus中的簡單函式模板和模板過載

物件導向的繼承和多型機制有效提高了程式的可重用性和可擴充性。在程式的可重用性方面,程式設計師還希望得到更多支援。舉乙個最簡單的例子,為了交換兩個整型變數的值,需要寫下面的 swap 函式:

void swap(int & x, int & y)

為了交換兩個 double 型變數的值,還需要編寫下面的 swap 函式:

void swap (double & xr double & y)

如果還要交換兩個 char 型變數的值,交換兩個 cstudent 類物件的值……都需要再編寫 swap 函式。而這些 swap 函式除了處理的資料型別不同外,形式上都是一樣的。能否只寫一遍 swap 函式,就能用來交換各種型別的變數的值呢?繼承和多型顯然無法解決這個問題。因此,「模板」的概念就應運而生了。

眾所周知,有了「模子」後,用「模子」來批量製造陶瓷、塑料、金屬製品等就變得容易了。程式語言中的模板就是用來批量生成功能和形式都幾乎相同的**的。有了模板,編譯器就能在需要的時候,根據模板自動生成程式的**。從同乙個模板自動生成的**,形式幾乎是一樣的。

c++ 語言支援模板。有了模板,可以只寫乙個 swap 模板,編譯器會根據 swap 模板自動生成多個 sawp 函式,用以交換不同型別變數的值。

在 c++ 中,模板分為函式模板和類模板兩種。函式模板是用於生成函式的,類模板則是用於生成類的。

函式模板的寫法如下:

template 返回值型別  模板名(形參表)

其中的 class 關鍵字也可以用 typename 關鍵字替換,例如:

template
函式模板看上去就像乙個函式。前面提到的 swap 模板的寫法如下:

template void swap(t & x, t & y)

t 是型別引數,代表型別。編譯器由模板自動生成函式時,會用具體的型別名對模板中所有的型別引數進行替換,其他部分則原封不動地保留。同乙個型別引數只能替換為同一種型別。編譯器在編譯到呼叫函式模板的語句時,會根據實參的型別判斷該如何替換模板中的型別引數。

例如下面的程式:

#include using namespace std;

templatevoid swap(t & x, t & y)

int main()

編譯器在編譯到swap(n, m);時找不到函式 swap 的定義,但是發現實參 n、m 都是 int 型別的,用 int 型別替換 swap 模板中的 t 能得到下面的函式:

void swap (int & x, int & y)

該函式可以匹配swap(n, m);這條語句。於是編譯器就自動用 int 替換 swap 模板中的 t,生成上面的 swap 函式,將該 swap 函式的源**加入程式中一起編譯,並且將swap(n, m);編譯成對自動生成的 swap 函式的呼叫。

同理,編譯器在編譯到swap(f, g);時會用 double 替換 swap 模板中的 t,自動生成以下 swap 函式:

void swap(double & x, double & y)

函式模板中可以有不止乙個型別引數。例如,下面這個函式模板的寫法是合法的:

template t2 print(t1 argl, t2 arg2)

注意:在書寫模板時,我們通常將函式模板寫進標頭檔案中,並且注意,函式宣告和定義前均要加上 template <。。。。>這句話。其實與我們之前寫函式一樣,只不過在宣告和定義前加上了 template <>

函式模板本質上還是函式,所以他也有過載,即函式名相同,引數型別或者個數不同。

比如:

templatevoid swap(t & x, t & y)

templatevoid swap(t & x, t & y ,t &z)

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 所謂函式模板,實際上是建立乙個通用函式,其函式型別和形參型別不具體指定,用乙個虛擬的型別來代表。這個通用函式就稱為函式模板。凡是函式體相同的函式都可以用這個模板來代替,不必定義多個函式,只需在模板中定義一次即可。在呼叫函式時系統會根據實參的型別...