模板定义:模板就是实现代码重用机制的一种工具,它可以实现类型参数化,即把类型定义为参数,从而实现了真正的代码可重用性。
一 基本定义
模版包括模版类和模版函数。
定义格式为;template <typename/class T> class和template没有区别。
inline模版函数:template<class T> inline T min(const T&,const T&);
模版形参包括类型模版形参和非类型模版形参。
例如,类型模版形参T,非类型模版形参N
template <class T,size N> void arrayinit(T (&sparm)[N])
{
for (size_t i=0;i!=N;i++)
parm[i]=0;
}
int x[42];double y[10];
arrayinit(x);//instaniates arrayinit(int(&) [42])
arrayinit(y);instaniates arrayinit(double(&) [10])
二 实例化:产生模版的特定类型的实例的过程
1模版实参推断(从实参推断形参)
(1)const 转换。即const和非const在实例化时互相转换。
(2)数组或函数到指针的转换。(若形参是引用类型,则不行。因为数组以引用方式传递时,传递整个数组,数组大小是传递参数的一部分)
2 函数模版的显式实参
(1)指定实参
#include <iostream>}
(2)在返回类型中使用类型形参
显式模版实参,从左到右匹配。
template <class T1,class T2,class T3>
T3 sum(T2,T1);
long val3=sum<long> (i,lng);//error因为尖括号内的long对应的是T1;所有没有给T3指定类型
long val2=sum<long,int,long>(i,lng);//ok
三 模版包含类型
1包含编译类型
调用函数时,编译器只需要看到函数的声明。一般而言,编译时类定义和函数声明放在头文件,而类成员函数和普通函数放在源文件。
模板则不同,编译器要求看到定义模版的源代码。所以在头文件中需要增加一条#include包含函数模板定义的源文件。即在头文件中加入#include":utility.cc"
2分别编译类型
据说在C++11已经被取消了