模板是C++中泛型編程的基礎,是C++語言的一個重要特性。利用模板機制可以顯著減少冗餘信息,節約程序代碼。
模板函數,實際上就是建立一個通用的函數,函數的參數類型和返回類型不具體指定,利用虛擬的類型來代替,在編譯調用模板函數時,編譯器會根據傳遞的參數自動推演出模板形參的類型,並自動生成相應的代碼。
//模板的聲明格式: template <typename 類型參數> 返回類型 函數名(模板形參表) { ...(函數體) }
template是聲明模板的關鍵字。
類型參數通常用C++標識符表示,例如:T、TP、Type等,這就是一個虛擬的類型名,也可以自定義
類型參數前要加關鍵字typename或class,它倆的作用相同,可以互換,都表示其後的參數是一個虛擬的類型名,但typename的含義比class更清晰。
**************************************************************************************
//函數模板的使用 #include<iostream> using namespace std; template <typename T> T min(T a, T b) { if (a > b) { return b; } else { return a; } } int main() { cout << "the min is:" << min(1, 2) << endl; cout << "the min is:" << min(1.1, 2.2) << endl; cout << "the min is:" << min<double>(1, 2.1) << endl; //顯示實例化 cout << "the min is:" << min<int>(1.1, 2) << endl; //顯示實例化 cout << "the min is:" << min('a', 'm') << endl; system("pause"); return 0; }
由上面的例子我們可以看出,函數模板提供了一類函數的抽象。上例的函數模板min(T,T)實例化成了函數min(int,int)、min(double,double)、min(char,char)。函數模板實現了函數參數的通用性,作爲一種函數的重用機制,可以大幅提高程序設計的效率。
我們也可以在調用函數的時候對參數列表進行顯示實例化來指定虛擬類型的參數類型。
注:在template語句與函數模板定義語句間不能插入別的語句!!
************************************************************************************
//模板函數可以與非模板函數構成重載 #include<iostream> using namespace std; template <typename T> T min(T a, T b) { cout << "調用模板函數" << endl; return (a > b)?b:a; } int min(int a, int b) { cout << "調用非模板函數"<<endl; return (a > b) ? b : a; } int main() { cout << "the min is:" << min(1, 2) << endl; cout << "the min is:" << min(1.1, 2.2) << endl; cout << "the min is:" << min('a', 'm') << endl; system("pause"); return 0; }
函數模板與同名的非模板函數構成重載時,函數調用時,先找一個參數完全匹配的非模板函數,如果找到就調用,找不到就找函數模板,將其實例化,產生一個與之匹配的模板函數。