// 模板头 template <typename T > 定义任意类型template<typename T>voidfun(T& a, T& b){
T temp = a;
a = b;
b = temp;}intmain(){int a =3, b =6;fun(a,b);// 隐式推导类型 char c ='t';fun(c,a);// 报错 要使用同一种类型
fun<int>(a,c);// 显示指定类型return0;}// 在定义模板的时候可以使用多个任意类型template<typename T1,typename T2>
函数模板与普通函数
// 1 函数模板和普通函数可以重载template<typename T>voidfun(T a){
cout<<"这是函数模板"<<endl;}voidfun(int a){
cout<<"这是普通函数"<<endl;}intmain(){int a =10;fun(a);// 2 函数模板和普通函数发生重载时,优先调用普通函数
fun<int>(a);// 强制调用函数模板// 3 普通函数在传参的时候,如果类型不匹配会进行强转,但是函数模板没有char c ='a';fun(c);return0;}
函数模板的简单使用
// 对 char 和 int 类型的数组进行排序template<typename T>voidSwap(T& a,T& b)// 交换函数{
T temp = a;
a = b;
b = temp;}template<typename T>// 排序函数voidSort(T arr[],int len){for(int i =0; i < len; i++){int min = i;for(int j = i +1; j < len; j++){if(arr[min]> arr[j])
min = j;}if(min != i)Swap(arr[min],arr[i]);}}intmain(){char str[]="abcdfghdjg";int len =strlen(str);Sort(str,len);int arr[5]={1,3,7,5,8};Sort(arr,5);return0;}
函数模板的局限性
classPerson{public:int age;Person(int age){this->age = age;}}template<typename T>boolCompare(T& a,T& b){
cout<<"111"<<endl;if(a == b)returntrue;returnfalse;}// 如果传入的参数是类对象的话,不能直接进行比较// 有一个语法可以解决这个问题// template<> 返回值类型 函数名<实参类型>(参数列表)template<>bool Compare<Person>(Person& a,Person& b){
cout<<"222"<<endl;if(a.age == b.age)returntrue;returnfalse;}// 也可以直接定义一个函数 来进行比较intmain(){
Person A(20);
Person B(21);int C =10;int D =15;Compare(A,B);// 222Compare(C,D);// 111return0;}
函数模板的使用// 模板头 template <typename T > 定义任意类型template<typename T>void fun(T& a, T& b){ T temp = a; a = b; b = temp;}int main(){ int a = 3, b = 6; fun(a,b); // 隐式推导类型 ...