文章目录
- 函数模板
- 1.函数模板概念
- 2.函数模板格式
- 3.函数模板的实例化
- 4.模板参数的匹配原则
- 类模板
- 1.类模板的定义格式
函数模板
1.函数模板概念
函数模板与类型无关,在使用时被参数化,根据实参类型产生函数的特定类型版本
2.函数模板格式
template<typename T,typename T2,.......,typename Tn>
返回值类型 函数名(参数列表){}
template<typename T>
void Swap( T& left, T& right)
{
T tmp = left;
left = right;
right = tmp;
}
3.函数模板的实例化
- 隐式实例化:让编译器根据实参推演模板参数的实际类型
template<typename T>
void Swap( T& left, T& right)
{
T tmp = left;
left = right;
right = tmp;
}
int main()
{int a = 1,b = 2;
double c = 3,d = 4;
Add(a,b);
Add(c,d);
Add(a,(int)c)
return 0;
}
- 显式实例化:在函数名后的<>中指定模板参数的实际类型
template<typename T>
void Swap( T& left, T& right)
{
T tmp = left;
left = right;
right = tmp;
}
int main()
{int a = 1,b = 2;
double c = 3,d = 4;
Add<int>(a,b);
Add<double>(c,d);
return 0;
}
4.模板参数的匹配原则
对于非模板函数和同名函数模板,如果其他条件都相同,在调动时会优先调用非模板函数而不会从该模板产生出一个实例。如果模板可以产生一个具有更好匹配的函数, 那么将选择模板
template<class T1, class T2>
T1 Add(T1 left, T2 right)
{
return left + right;
}
int main()
{
Add(1, 2); //非模板函数
Add(1, 2.0); //模板函数可以产生更好匹配的函数,调用模板函数
return 0;}
类模板
1.类模板的定义格式
template<class T1, class T2, ..., class Tn>
class 类模板名
{
};
``
## 2. 类模板的实例化
类模板实例化需要在类模板名字后跟<>,然后将实例化的类型放在<>中即可,类模板名字不是真正的类,而实例化的结果才是真正的类。```cpp
// Stack是类名,Stack<int>才是类型
//stack st1;//是错误的
Stack<int> st1; // int
Stack<double> st2; // double