目录
一、模板的概念
二、函数模板
三、普通函数与函数模板
3.1区别
3.2调用规则
一、模板的概念
- 模板不能直接使用,它只是一个框架
- 模板的通用并不是万能的
- 分为两类:函数模板、类模板
二、函数模板
- 函数模板语法:
template<typename T >
函数声明或定义
- 解释:
template --- 声明创建模板
typename --- 表面其后面的的符号是一种数据类型,可以用class代替
T --- 通用的数据类型,名称可以替换,通常为大写字母
代码示例
#include<iostream>
using namespace std;template<typename T>
void Swap(T &a, T &b){T tmp = a;a = b;b = tmp;
}
void test(){int a = 10;int b = 20;//自动类型推导Swap(a,b);cout<<"a="<<a<<" b="<<b<<endl;double c = 1.1;double d = 2.2;// 显示指定类型Swap<double>(c,d);cout<<"c="<<c<<" d="<<d<<endl;
}
int main(){test();return 0;
}
排序案例---代码说明
#include<iostream>
using namespace std;//交换模板
template<typename T>
void Swap(T &a,T &b){T tmp = a;a = b;b = tmp;
}//排序模板
template<typename T>
void Sort(T &charArr,int &len){for(int i=0;i<len;i++){int max = i;for(int j=i+1;j<len;j++){if(charArr[max] < charArr[j]){max = j;}}if(max != i){Swap(charArr[max],charArr[i]);}}
}// 打印数组模板
template<typename T>
void print(T &Arr,int &len){for(int i=0;i<len;i++){cout<<Arr[i]<<" ";}cout<<endl;
}void test(){char Arr[] = "bdacfe"; // 字符排序int len = sizeof(Arr) / sizeof(char);Sort(Arr,len);print(Arr,len);}void test1(){int Arr1[] = {4,7,1,3,6,0,8,2,5,9}; // 数组排序int len = sizeof(Arr1) / sizeof(int);Sort(Arr1,len);print(Arr1,len);
}
int main(){test();test1();return 0;
}
三、普通函数与函数模板
3.1区别
- 普通函数调用时可以发生隐式类型转换
- 函数模板调用时,自动类型推导(不会发生隐式类型转换)、显示指定类型(可以发生隐式类型转换)
代码示例
#include<iostream>
using namespace std;int Add(int a, int b){return a+b;
}template<typename T>
int Add1(T a, T b){return a+b;
}void test(){int a = 10;char c = 'c';cout<<Add(a,c)<<endl; // 109
// cout<<Add1(a,c)<<endl;//错误cout<<Add1<int>(a,c);//109}int main(){test();return 0;
}
3.2调用规则
- 如果函数模板和普通函数都可以实现,优先调用普通函数
- 可以通过空模板参数列表来强制调用函数模板
- 函数模板也可以发生重载
- 如歌函数模板可以产生更好的匹配,有限调用函数模板
代码示例
#include<iostream>
using namespace std;void print(int a, int b){cout<<"普通函数的调用"<<endl;
}template<typename T>
void print(T a, T b){cout<<"函数模板的调用"<<endl;
}template<typename T>
void print(T a, T b,T c){cout<<"函数模板重载的调用"<<endl;
}void test(){int a = 1;int b = 1;print(a,b);//普通函数的调用print<>(a,b);//函数模板的调用print(a,b,1);//函数模板重载的调用char c = 'a';char d = 'a';print(c,d);//函数模板的调用,因为调用普通函数时需要进行隐式转换
}int main(){test();return 0;
}