1、定义函数模板:
- template<typename T>
- inline T const& Max(T const& a, T const& b){
- return a < b ? b : a;
- }
解释:template表明了这是一个函数模板,<>指定了模板参数区域,typename表明了后面的参数是一个类型名, T是模板参数,它可以用来指定所有的类型,a和b是调用参数,位于模板函数名称后面,在一对()内进行声明。这里typename可以用class来取代,但最好使用typename。
2、调用函数模板
- #include<iostream>
- #include<string>
- using namespace std;
-
- template<typename T>
- inline T const& Max(T const& a, T const& b){
- return a < b ? b : a;
- }
- int main(){
- cout << Max(5, 8) << endl;
-
- cout << Max(3.4, -6.5) << endl;
-
- string str1 = "math";
- string str2 = "mathmatics";
- cout << Max(str1, str2) << endl;
-
- system("pause");
- return 0;
- }
调用函数模板时,模板被编译两次:
第一次:实例化之前,检查模版代码本身,查看语法是否正确。
第二次:在实例化期间,检查模版代码,查看是否所有的调用都有效。
3、重载函数模板
函数模版也可以进行重载,一个非模版函数可以和一个同名的函数模版同时存在,调用的优先级是非模板函数的优先级高。<>符号显式指定一个空的模板实参列表,告诉编译器只有模板才能匹配这个调用,而且所有的模板参数都应该根据调用实参演绎出来。函数的所有重载版本的声明都应该位于该函数被调用的位置之前。
例子说明:
- #include<iostream>
- #include<string>
- using namespace std;
-
- inline int const& Max(int const& a, int const& b){
- cout << "调用(1):";
- return a < b ? b : a;
- }
-
- template<typename T>
- inline T const& Max(T const& a, T const& b){
- cout << "调用(2):";
- return a < b ? b : a;
- }
- template<typename T>
- inline T const& Max(T const& a, T const& b,T const& c){
- cout << "调用(3):";
- return Max(Max(a, b), c);
- }
-
- int main(){
- cout << Max(7, 45, 44) << endl;
- cout << Max(7.2, 5.7) << endl;
- cout << Max<>(4, 5) << endl;
- cout << Max(4, 5) << endl;
-
- system("pause");
- return 0;
- }