1. 程式人生 > >函數模板的使用說明

函數模板的使用說明

stl 存儲 log div fun pac pep 簡單的 blog

/*
 * 函數模板
 * 當調用某個函數時,就要以某種方式傳遞類型給這個函數。那麽就能夠使用一個函數定義替換前面額全部這些函數定義了。

* 模板就能夠做到這一點: * 模板機制是重要的強大的。而且如我們說提到的,在C++的標準模板庫(STL)中從頭到尾都在是使用它。 * 模板使得類和函數不僅能通過形參接收要被存儲和處理的數據值。還能夠通過形參接收數據的類型。因此這 * 提供了一種編寫通用和易於重用的代碼的方法。由於模板定義能夠用來創建一個類或函數的多個實例, * 每一個實例都能夠存儲和處理一種不同類型的數據。

* */ //我們針對數值交換問題寫一個函數模板 #include <iostream> #include <string> using namespace std; template <typename DataType> /* * 告訴編譯器兩件事: * 1.這個是一個函數模板,一個由此能夠創建函數的模式 * 2.標識符DataType取代了某個類型形參的名字。當函數被調用時。將被給定一個值 * * 使用形參DataType取代某個特定的類型,定義的剩余部分則簡單的規定了程序的行為。在哈蘇模板內部和外部 * 它都沒有做不論什麽事情,當編譯器碰到一個模板,比如swap()。它不過簡單地存儲這個模板而不產生不論什麽實際的機器指令 * 他在依據須要的基礎上使用模板給出的模式來產生實際的函數定義。 */ void swap(DataType& first,DataType& second) { DataType temp = first; first = second; second = temp; } /* * 函數模板 * 形式: * template <typename TypeParam> * function * 或 * template <class TypeParam> * function * * 更通用的形式: * template <specifier TypePaream1,...,specifier TypeParamn> * function * 在這些形式中。TypeParam,TypeParam1...是表示函數在其上的操作的值的類型的通用類型形參,每一個specifier * 是關鍵詞typename或者class;而function是這個函數的原型或者定義。 * 註意: * 1.單詞template是一個C++的關鍵詞,規定其後說跟的是一個函數模式,而不是一個實際的函數原型或者定義 * 2.關鍵詞typename和class能夠哎一個類型形參列表中交換使用 * 3.和正規的函數不同,一個函數模板不能被切割為一個包括他們的原型的頭文件和一個包括唐門頂一個的編譯文件。在不論什麽的 * #include函數模板的程序中,他們的定義必須和他們的編譯,這樣,一種通用的方式將他們放在一個文件裏,還有一種方法是 * 將定義放在單獨的文件裏,可是在函數原型所在的文件的最後#include定義文件。

* 4.一個函數模板不過描寫敘述依據給定的實際類型產生不同的函數的一個模式,這個創建函數的過程被稱為實例化。在每一個實例化中。 * 類型形參被稱為綁定到一個傳遞給他的實際類型。 * 5.在通用形式中,假設編譯器只依靠調用中的實參的類型來決定綁定什麽呢類型到類型形參。那麽每一個類型形參必須在函數的形 * 參列表中至少出現一次。 */ /* * 一個函數模板的實例化是通過使用以下的算法進行的: * 1.在函數模板的形參列表中的搜索類型形參 * 2.為每一個雷系ing形參推斷對應實參的類型 * 3.將這兩種類型綁定在一起 */ template <typename ElementType> void display(ElementType array[],int numElement) { for(int i=0;i<numElement;i++) cout << array[i] << " "; cout << endl; } int main() { string first = "C++"; string second = "C"; swap(first,second); double x[] = {1.1,2.1,3.2,4.5,6.5,7.6}; display(x,sizeof(x)/sizeof(double)); int num[] = {1,2,3,4,5,6}; display(num,sizeof(num)/sizeof(int)); }


函數模板的使用說明