一、c++中模板是什么?
首先:
1 int Max(int x, int y) 2 { 3 return x > y ? x : y; 4 } 5 6 float Max(float a,float b) 7 { 8 return a > b ? a : b; 9 }
通常我们想要比较不同数据类型的时候不得不定义两种不同的函数来表示区分,为了能精简代码和避免强类型的严格性和灵活性的冲突,我们就需要用到模板去改善这种情况。
二、为什么要定义模板?
强类型程序设计中,参与运算的所有对象的类型在编译时即确定下来,并且编译程序将进行严格的类型检查。为了解决强类型的严格性和灵活性的冲突。有以下3种方式解决:
1)带参数宏定义(原样替换)
2)重载函数(函数名相同,函数参数不同)
3)模板(将数据类型作为参数)
模板的使用中函数模板、类模板用的最广最繁。
函数模板
定义:
template <模板参数表>
返回类型 函数名 (参数列表)
{
//函数体
}
注:class或typename修饰的类型参数,代表一种类型;非类型参数表达式,可以是int,long,long long类型,使用已知类型符,代表一个常量
1 //1.函数模版的隐式实例化 2 #include <iostream> 3 using namespace std; 4 5 template <class T> 6 T Max(T x, T y); //函数模版的申明 7 8 int main() 9 { 10 int intX = 1, intY = 2; 11 double dblX = 3.9, dblY = 2.9; 12 cout << Max(intX, intY) << endl; //实参为int型,生成int型模板函数,并对第二个参数进行检查 13 //或者cout << Max<int>(intX, intY) << endl; 14 cout << Max(dblX, dblY) << endl; //实参为double型,生成double型模板函数,并对第二个参数进行检查 15 //或者cout << Max<double>(dblX, dblY) << endl; 16 cout << Max(dblY,intX) << endl; //模板函数做不到两个参数类型不一致还可以比较 17 18 return 0; 19 } 20 21 template <class T> 22 T Max(T x, T y) //函数模版的实现 23 { 24 return (x > y ? x : y); 25 }
1 //2.函数模板和函数模板的重载 2 #include <iostream> 3 using namespace std; 4 5 template < class T > 6 T Max(T x, T y); 7 8 template <class T> 9 T Max(T x, T y, T z) 10 { 11 return x > y ? (x > z ? x : z) : (y > z ? y : z); 12 } 13 14 int main() 15 { 16 int intX = 1, intY = 2, intZ = 3; 17 double dblX = 3.0, dblY = 2.9; 18 19 cout << Max<int>(intX, intY) << endl; //调用实例化的Max(int,int) 20 cout << Max<int>(intX, intY, intZ) << endl; //调用实例化的Max(int,int,int) 21 cout << Max<double>(dblX, dblY) << endl; //显示实例化为double型,生成double型模板函数 22 cout << Max('A', '8') << endl; //隐式实例化char型,生成char型模板函数 23 return 0; 24 } 25 26 template <class T> 27 T Max(T x, T y) 28 { 29 return x > y ? x : y; 30 }
类模板
定义:
template<模板参数表>
class 类名
{
}
下面给出一个栈的模板实现类:
1 #include <iostream> 2 using namespace std; 3 4 #define MaxSize 10 5 6 template <class T> 7 class CStack 8 { 9 private: 10 T data[MaxSize]; 11 int top; 12 public: 13 CStack():top(-1) 14 { 15 } 16 void Push(void); 17 void Pop(void); 18 bool ifEmpty() 19 { 20 if(top == -1) 21 return true; 22 else 23 return false; 24 } 25 bool ifFull() 26 { 27 if(top == MaxSize-1) 28 return true; 29 else 30 return false; 31 } 32 T getTop(void) 33 { 34 if(ifEmpty()) 35 { 36 cout<<"栈为空,不能取栈顶!"<<endl; 37 return -1; 38 } 39 return this->data[top]; 40 } 41 }; 42 43 template <class T> 44 void CStack<T>::Push(void) 45 { 46 if(ifFull()) 47 { 48 cout<<"栈已满,不能入栈!"<<endl; 49 return ; 50 } 51 T a; 52 cin>>a; 53 this->data[++top] = a; 54 cout<<"元素"<<a<<"入栈!"<<endl; 55 } 56 57 template <class T> 58 void CStack<T>::Pop(void) 59 { 60 if(ifEmpty()) 61 { 62 cout<<"栈为空,不能出栈!"<<endl; 63 return ; 64 } 65 T temp = this->data[top--]; 66 cout<<"元素"<<temp<<"出栈!"<<endl; 67 } 68 69 70 int main() 71 { 72 CStack<int> s1; //可以自己更换数据类型int 73 int i; 74 do 75 { 76 cout<<" =============================== "; 77 cout<<" *********顺序栈类模板********** "; 78 cout<<" 1.入栈 "; 79 cout<<" 2.出栈 "; 80 cout<<" 3.取栈顶 "; 81 cout<<" 0.退出 "; 82 cout<<" ******************************* "; 83 cout<<" =============================== "; 84 do 85 { 86 cout<<" please input your operator:"; 87 cin>>i; 88 system("cls"); 89 }while(i!=1 && i!=2 && i!=3 && i!=0); 90 switch(i) 91 { 92 case 1: 93 s1.Push(); 94 system("pause"); 95 system("cls"); 96 break; 97 case 2: 98 s1.Pop(); 99 system("pause"); 100 system("cls"); 101 break; 102 case 3: 103 if(-1 == s1.getTop()) 104 { 105 system("pause"); 106 system("cls"); 107 break; 108 } 109 else 110 cout<<"栈顶元素为:"<<s1.getTop()<<endl; 111 system("pause"); 112 system("cls"); 113 break; 114 } 115 }while(i != 0); 116 }