一、函数模板的基础用法
函数模板允许以任意类型的方式来定义函数,模板使用如下:
template<typename/class T> //使用typename或class均可
返回值类型 函数名(T a,T b...){ 函数体 }
函数模板在声明和定义时均需要写template<typename/class T> 。函数模板一般放在头文件当中,并在需要使用模板的文件中包含头文件。
函数模板同样可以重载,即函数的特征标(形参的类型或个数)不同。
二、函数模板的显式具体化
函数模板显式具体化即在已定义常规模板的前提下,针对特定参数类型(如类、结构体)单独编写函数;当调用函数参数列表匹配该特定参数类型时,将调用显式具体化的函数模板,而非常规模板。
在显式具体化函数上,C++采用以下规则:
1.对于给定的函数名,可以有非模板函数、模板函数、显式具体化模板函数及它们的重载版本。
2.显示具体化以template<>打头,并在参数列表中指出类型。
3.在调用上,显式具体化优先于常规模板,非模板函数优先于显式具体化和模板函数。
三、实例化和具体化
隐式实例化:函数模板本身不会生成函数定义。编译器在使用模板为特定类型生成函数定义时,才得到模板实例,这种方式称为隐式实例化。
显式实例化:直接命令编译器生成特定的实例,其语法是,在创建模板的前提下,在声明时用<>在函数名后指定特定的类型,并在最前面加上template。
template 返回值类型 函数名<特定类型>(形参);
显式具体化:显式实例化是提前生成实例,显式具体化是针对特定类型使用不同的规则。在语法上,区别在于<>的位置不同,显式实例化的<>位于函数名之后,显式具体化的<>位于template之后,函数名之前。