temlate模板
函数模板的声明
>创建一个通用的函数, 支持多种不同的形参, 避免重载函数的函数体重复设计, 把函数使用的数据类型作为参数;
template<typename 数据类型参数标识符> <返回类型><函数名>(参数表) { 函数体 }
>template是定义模板函数的关键字; typename(或class)是声明数据类型参数标识符的关键字; 用以说明它后面的标识符是数据类型标识符;
>函数模板声明了一个函数的描述, 不是一个可以直接执行的函数, 只有根据实际情况用实参的数据类型代替类型参数标识符后才能产生真正的函数;
>关键字typename可以用class代替, 数据类型标识符可以使用所有C++数据类型;
函数模板的生成
>函数模板的类型参数标识符是一个类型形参, 在使用时要将形参实例化为确定的数据类型, 实例化的的参数称为模板实参, 函数称为模板函数;
1) 函数模板允许使用多个类型参数, 但在定义部分每个形参前必须有关键字typename或class;
template<class 数据类型参数标识符1,…,class 数据类型参数标识符n> <返回类型><函数名>(参数表) { 函数体 }
2)在template语句与函数模板定义语句<返回类型>之间不允许有别的语句;
3)模板函数类似于重载函数, 区别: 函数重载时, 每个函数体内可以执行不同的动作; 但同一个函数模板实例化后的模板函数都必须执行相同的动作;
函数模板异常处理
>函数模板中的模板形参可实例化成各种类型, 但当实例化模板形参的各模板实参之间不完全一致时, 会出现错误;
template <typename T>
void min(T &x, T &y)
{ return(x<y)?x:y; }
void func(int i, char j)
{
min(i, i);
min(j, j);
min(i, j);