在求解整型数组长度的时候,采用了函数模板的方法,所以顺便再次复习了一下函数模板的知识。(求解整型数组长度,参见我的上一篇博客)。
函数模板(funcion template)是一个独立于类型的函数,可作为一种方式,产生函数的特定类型版本。(C++ Primer定义)。
函数模板提供了一种用来自动生成各种类型函数实例的算法。程序员对于函数接口参数和返回类型中的全部或者部分类型进行参数化而函数体保持不变。
举例:求解两个数的最小值min()的函数模板定义:
template <class Type>
Type min( Type a, Type b ) {
return a < b ? a : b;
}
模板定义以关键字template开始,后接模板形参表(tempate parameter list),模板形参表是用尖括号括住的一个或多个模板形参(template parameter)的列表,形参之间以逗号分隔。模板形参表不能为空。
模板形参可以是表示类型的类型形参,也可以是表示常量表达式的非类型形参。非类型形参跟在类型说明符之后声明,类型形参跟在关键字class或typename之后定义。
模板非类型参数由普通的参数声明构成模板非类型参数表示该参数名代表了一个潜在的值而该值代表了模板定义中的一个常量,例如size是一个模板非类型参数它代表arr指向的数组的长度
template <class Type, int size>
Type min( Type (&arr) [size] );
当函数模板min()被实例化时size的值会被一个编译时刻已知的常量值代替。函数定义或声明跟在模板参数表后除了模板参数是类型指示符或常量值外,函数模板的定义看起来与非模板函数的定义相同。
template <class Type, int size>
Type min( const Type (&r_array)[size] )
{
/* 找到数组中元素最小值的参数化函数 */
Type min_val = r_array[0];
for ( int i = 1; i < size; ++i )
if ( r_array[i] < min_val )
min_val = r_array[i];
return min_val;
}
在程序的运行过程中Type会被各种内置类型和用户自定义的类型所代替,而size会被各种常量值所取代。这些常量值是由实际使用的min()决定的。记住一个函数的两种用法是调用它和取它的地址。
当一个名字被声明为模板参数之后,它就可以被使用了,一直到模板声明或定义结束为止,模板类型参数被用作一个类型指示符可以出现在模板定义的余下部分,它的使用方式与内置或用户自定义的类型完全一样,比如用来声明变量和强制类型转换模板。非类型参数被用作一个常量值可以出现在模板定义的余下部分它可以用在要求常量的地方,或许是在数组声明中指定的大小或作为枚举常量的初始值。