一 使用模板的意义
当我们进行int型数据交换时调用swap函数:
void swap(int &a , int &b)
{
*a ^= *b;
*b ^= *a;
*a ^= *b;
}
但该函数面对double,char,long等其他类型时,不适用。
解决办法:重载
void swap(double &a , double &b)
{
*a ^= *b;
*b ^= *a;
*a ^= *b;
}
void swap(char &a , char &b)
{
*a ^= *b;
*b ^= *a;
*a ^= *b;
}
尽管可以解决问题,但代码冗余,没有代码复用,且主体出错时,需要全部重新修改,不推荐
从而C++使用模板,即泛型编程的概念,来解决类型不同,函数体或者类体相同的问题 。
将类型参数化,从而形成模板。
**注:
1,模板需要实例化才能使用,只不过将实例化过程交给编译器完成(重载是人来进行实例化),生成对应类型的函数体,故模板不能够提高代码效率
2,特别关注:模板调用时,类型严格匹配,不允许类型隐式转换
3,模板即类型参数化,特化即类型确定化
**
二 类模板
结构:
template <typename T1 , typename T2>
class myclass{
T2 fun(T1){}
T1 data1;
T2 data2;
};
三 函数模板
结构
template<typename T1 ,typename T2>
T1 funtion(T2 data){
}
四 类模板全特化和偏特化:即确定类型参数
1,全特化结构
template <>
class myclass<int,char>{
char fun(int){}
int data1;
char data2;
};
2,偏特化结构
template <typename T1>
class myclass<T1,int>{
int fun(T1){}
T1 data1;
int data2;
};
四 函数模板全特化:对于函数直接进行重载
结构:
template<>
int funtion(char data){
}