模板简单认识
函数模板与类模板
函数模板的实例化
隐式实例化:让编译器根据实参推演模板参数的实际类型
template<class T>
T Add(const T& left, const T& right)
{
return left + right;
}
int main()
{
int a1 = 10, a2 = 20;
double d1 = 10.0, d2 = 20.0;
Add(a1, a2);
Add(d1, d2);
return 0;
}
但是如果你想这样是不可以的:编译器会无法确定此处到底该将T确定为int 或者 double类型而报错
Add(a1,d1);
我们可以这样解决:将其强制转为同一类型
Add((double)a1, d1);
显式实例化:在函数名后的<>中指定模板参数的实际类型
int main()
{
int a = 10;
double b = 20.0;
// 显式实例化
Add<int>(a, b);
return 0;
}
当然,实例化这里还有一些其他的玩法:
template<class T1, class T2>//比如可以有两个模板参数来实例化
T1 Add(T1 left, T2 right)
{
return left + right;
}
void Test()
{
Add(1, 2);
Add(1, 2.0);
}
template<class T1=char, class T2=int>//可以跟函数参数一样给缺省值
T1 Add(T1 left, T2 right)
{
return left + right;
}
可以发现其实模板参数和函数参数非常像,只不过函数参数给的是参数值,模板参数给的是参数类型
匹配原则
一个非模板函数可以和一个同名的函数模板同时存在,而且该函数模板还可以被实例化为这个非模板函数
对于非模板函数和同名函数模板,如果其他条件都相同,在调动时会优先调用非模板函数而不会从该模板产生出一个实例。如果模板可以产生一个具有更好匹配的函数, 那么将选择模板。
类模板的定义格式
template<class T1, class T2, ..., class Tn>
class 类模板名
{
// 类内成员定义
};
模板复用了代码,节省资源,更快的迭代开发,C++的标准模板库(STL)因此而产生:
比如vector:
// Vector类名,Vector<int>才是类型
Vector<int> s1;
Vector<double> s2;
类模板实例化与函数模板实例化不同,类模板实例化需要在类模板名字后跟<>,然后将实例化的 类型放在<>中即可,类模板名字不是真正的类,而实例化的结果才是真正的类。