目錄
- 初識模板
- 函數模板
- 函數模板實例化
- 顯式實例化
- 隱式實例化
初識模板
求兩個int、float、char類型的數據的最大值:
C里面要這樣寫:
int maxInt(int x, int y);
double maxDouble(double x, double y);
char maxChar(char x, char y);
C++使用函數重載(多個同名函數處理多種類型數據的語法現象)可以使得三個函數的名字一樣:
而我們期待的是下面這種類型:
函數模板
單個類型參數:
template <typename T>
returnType function(T para1,...) {//Body
}
在函數模板中,可以用泛型的地方包括:
1、函數返回值
2、函數參數
3、函數局部變量
多個類型參數:
template <typename T, typename S>
auto add(T x1, S x2) {return (x1 + x2);
}
在主函數中調用此函數:
int main() {auto y = add(1,2.0);return 0;
}
編譯器根據函數調用的實參,生成函數模板的實例:
函數模板實例化
注意模板多態屬于靜態聯編,與函數重載屬于同一層面。
有兩種實例化方法 (確定模板實參的方法):
Explicit instantiation (顯式實例化)
Implicit instantiation (隱式實例化)
顯式實例化
強制某些函數實例化,可出現于程序中模板定義后的任何位置。
template < typename T >
void f( T s ){std::cout << s << '\n';
}
template void f<double>(double); // 實例化,編譯器生成代碼// void f(double s) { // T: double// std::cout << s << '\n';// }
template void f<>(char); // 實例化 f<char>(char) ,推導出模板實參
template void f(int); // 實例化 f<int>(int) ,推導出模板實參
隱式實例化
編譯器查看函數調用,推斷模版實參,實現隱式實例化。
#include <iostream>
template<typename T>
void f(T s) {std::cout << s << '\n';
}
int main(){f<double>(1); // 實例化并調用 f<double>(double)f<>('a'); // 實例化并調用 f<char>(char)f(7); // 實例化并調用 f<int>(int)void (*ptr)(std::string) = f; // 實例化 f<string>(string)
}
由函數模板實例化得到的函數叫做“實例函數”,由類模板實例化得到的類叫做“實例類”