模板 :(泛型编程利用的主要技术)
(PS:大佬自动跳过,本文是作为一个入门级选手的个人理解,针对刚开始学习的朋友们 ~ 0 ~)
目的:
建立通用模具,将类型参数化,提高程序的复用性
分类:
函数模板、类模板
局限性:
通用不具有万能性 :例如数组、自定义数据类型的直接赋值问题
解决: C++为解决这一问题提供模板重载,可以为这些特定的数据类型提供具体化的模板
目的: 利用具体化的模板可以解决自定义类型的通用化,但模板的学习并不是为了写模板,而是为了在STL能够运用系统提供的模板
函数模板:
利用关键字template,建立一个通用函数,此函数不能直接使用,
只是一个框架,其形参和返回值类型可以不具体定制,可以用一个虚拟类型代替
语法:(注意:一个template的使用只能对应一个函数声明或定义)
template <typename T>
函数声明或定义(只能写一个)
解释:
template 表明创建模板
typename 表明其后的符号是一种数据类型,可以用 class 代替
T 通用数据类型,名称可以替换,常用大写字母表示
注意:
(template< typename T >与template< class T >
一般情况下这两个通用,但有一个特例,就是当 T 是一个类,而这个类又有子类(假设名innerClass 时,应该用 template< typename >)
使用方式:
1.自动类型推导
2.显式指定类型
注意事项:
1.自动数据类型推导,必须推导出一致的数据类型T,才能使用
2.模板必须要确定出T的数据类型才能使用
*/
== 理论转化为实践如下==
//
#include<iostream>
using namespace std;
template <typename T> //声明一个模板,告诉编译器代码后面紧跟的T不要报错,T是一个通用数据类型
void myswap(T &a,T &b){
T temp = a;
a = b;
b = temp;
}
template <class T>
void su(){ //直接调用该函数会报错,因为创建模板后并没使用
cout <<"模板必须确定出T的类型才能使用,且该错误只有当使用该模板编译器才会报错!!!!"<<endl;
cout <<"但如果 显式类型调用就不会报错" <<endl;
}
template <typename T,typename G>
void sg(T a,G b){ //T G 各自类型不受对方约束
}
void test1(){
int a = 3;
int b = 5;
float c = 5.5;
float d = 7.8;
//显式指定类型
myswap<int>(a,b);
//自动类型推导
myswap(c,d);
myswap(c,d);//再次调用相同类型时不再另生成函数
//myswap(a,c); false ,推导不出一致的T类型
//su(); //false
su<int>(); //right
}
/
//局限性体现:若 a , b 是两个数组或自定义的数据类型,该操作无法实现
template<typename T>
void similar(T a, T b){
if(a == b)
cout << "same"<<endl;
else cout <<"different"<<endl;
}
class person{
public :
int m_age;
string m_name;
person(int age,string name){ //C++默认不提供有参构造
m_age = age;
m_name = name;
}
};
//利用具体化person版本实现代码,具体化优先调用
template <> void similar(person a, person b){
if(a.m_age == b.m_age && a.m_name == b.m_name)
cout <<"same" <<endl;
else cout << "different" <<endl;
}
void test3(){
person a(4,"wang");
person b(6,"fan");
similar(a,b);
}
///
//简单案例实现:数组排序
template<typename T>
void ArySort(T arr[],int len){ //参数列表可以不全是T类型
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){
arr[min] ^= arr[i];
arr[i] ^= arr[min];
arr[min] ^= arr[i];
}
}
}
template<class T>
void Print(T a,int len){
for(int i = 0; i < len; i++)
cout << a[i] <<endl;
}
void test2(){
char a[6] = "afdkg";
int b[9] = {8,6,3,5,4,9,3,1,2};
ArySort(a,5);
ArySort(b,9);
Print(a,5);
Print(b,9);
}
//
int main(){
test1();
test2();
test3();
return 0;
}