目录
一、模板的概念
- 模板不能直接使用,它只是一个框架
- 模板的通用并不是万能的
- 分为两类:函数模板、类模板
二、函数模板
- 函数模板语法:
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;
}