文章目录
模板的意义
可以对类型进行参数化
函数模板
怎样定义模板参数列表
template<typename T>
template<class T>
在模板定义中,模板的参数不能为空,因为后面还有模板的特例化,在特例化中模板的参数为空。
模板的类型参数
一般来说,我们可以将类型参数看作类型说明符,就像内置类型或类类型说明符一样使用。特别是,类型参数可以用来指定返回类型或函数的参数类型,以及在函数体内用于变量声明或类型转换,
模板的非类型参数
除了定义类型参数,还可以在模板定义中定义非类型参数。一个非类型参数表示一个值而非一个类型。我们通过一个特定的类型名而非关键字class 或 typename来指定非类型参数。
当一个模板被实例化时,非类型参数被一个用户提供的或编译器推断出的值所代替。这些值必须是常量表达式,从而允许编译器在编译时实例化模板
模板的实例化
//定义一个模板函数
template<typename T>
T add(T a,T b)
{
return a + b;
}
int main()
{
//参数列表为整型,模板会自动推导出T 类型
//这里只有一个模板参数,如果传入的两个值得类型相同,则T类型为传入值的类型
//如果传入的两个值的类型不相同,则编译出错,例如 int a = add(1, 2.232);
int a = add(1,2);
}
模板函数与函数模板
函数模板是前面我们定义的那部分代码,模板的代码是不编译的,只有将模板实例化为模板函数的时候,才对模板函数进行编译。所以,模板的定义与函数模板的调用不能再不同的文件中,因为如果不在同一个文件中,模板不编译,在进行模板的实例化的过程中,找不到模板的定义就会报错。
经过实例化后的的函数叫做模板函数。模板本身不编译,实例化以后才编译
模板的实参推演
在前面的实例化中我们也可以看出&