1、什么是模板?
2、模板的原理?
3、模板函数、模板类
4、非类型模板参数
5、特化--类型萃取
6、模板的分离编译
1,什么叫做模板?
C++最重要的特性之一就是实现代码的重用.重用要求代码具有通用型.实现代码通用,不受数据类型的影响,就可以自动的使用数据类型的变化.这就是参数多态,它是通过模板实现的.
void swap(int* x, int* y)
{
int tmp = *x;
*x = *y;
*y = tmp;
}
void swap(char* x, char* y)
{
char tmp = *x;
*x = *y;
*y = tmp;
}
void swap(float* x, float* y)
{
float tmp = *x;
*x = *y;
*y = tmp;
}
上面的三个函数的函数体相同,只是形参类型不同.可以利用重载和多态来实现,但是非常复杂繁琐.并且,如果定义了double类型的实参,调用函数就会出错.为了解决上述问题,C++机制引入了模板.
C语言支持两种模板类型:函数模板和类模板
函数模板可以用来创建一个通用功能的函数.以支持多种不同的形参.
函数模板格式
函数模板的一般形式如下:
template <class或者也可以用typename 形参名1,class 形参名2,class 形参名>
返回类型 函数名(形参表)
{//函数定义体 }
说明: template是一个声明模板的关键字,表示声明一个模板关键字class不能省略,如果类型形参多余一个 ,每个形参前都要加class <类型 形参表>可以包含基本数据类型可以包含类类型.
template <class T>
void swap(T *x, T *y)
{
T tmp = *x;
*x = *y;
*y = tmp;
}
函数模板的反汇编
普通函数的反汇编
模板参数传递的是类型.
函数模板如果没有实例化,不会生成实例化代码.因此编译器不会检查模板函数内部的语法,如下代码并未定义tmp直接使用,依然成功:
执行结果如下:
template<class T>
T compare(T x, T y)
{
return x > y ? 0 : 1;
}cout << compare(1, 2) << endl;
cout << compare(1, 1.2) << endl;
对于上面的代码进行测试.
发现错误如上.只有一个T不能同时表示两种类型.
template<class T>
T compare(T x, T y)
{
return x > y ? 0 : 1;
}
template<class T1,class T2>
T2 compare(T1 x, T2 y)
{
return x > y?0 : 1;
}
int main()
{
cout << compare(1, 2) << endl;
//cout << compare(x, z) << endl;
cout << compare<int,int>(1.5,1) << endl;
}
修改代码如上,结果如下
显示实例化
cout << compare<int,int>(1.5,1) << endl;
如果模板函数实例化的函数和已有的函数是同类函数,则编译器直接调用已有的函数,而不会重新实例化新的函数.
举个例子来说,假如要打扫卫生,如果已经有了扫把,就不会去买一把新的,直接使用已有的扫把,省时省心.