函数模板代表一个函数家族。
通常而言,并不是把模板编译成一个可以处理任何类型的单一实体,而是对于实例化模板参数的每种类型,都从模板产生一个不同的实体。
关于模板编译,会有2个过程,分别发生在:(请注意VC++与GCC之间的不同)
1. 实例化之前,先检查模板代码本身,查看语法是否正确,在这里会发现错误的语法,如遗漏分号等。
2. 在实例化期间,检查模板代码,查看是否所有的调用都有效。在这里会发现无效的调用,如该实例化类型不支持某些函数调用等。
函数模板有两种类型的参数:
1. 模板参数: 位于函数模板名称的前面,在一对尖括号内部进行声明:
template <typename T>
2. 用参数:位于函数模板名称之后,在一对圆括号内部进行声明:
max(T const& a, T const& b);
可以额根据需要声明任意数量的模板参数。然而,在函数模板内部(这一点和类模板不同),不能指定缺省的模板实参。
当模板参数和调用参数没有发生关联,或者不能有调用参数来决定模板参数的时候,你在调用时就必须显式指定模板实参。然而,模板实参演绎并不适合返回类型,因为RT不会出现在函数调用参数的类型里面,因为,函数调用并不能推导出RT,也就是必须显式地指定模板实参列表。
重载函数模板
通常而言,并不是把模板编译成一个可以处理任何类型的单一实体,而是对于实例化模板参数的每种类型,都从模板产生一个不同的实体。
关于模板编译,会有2个过程,分别发生在:(请注意VC++与GCC之间的不同)
1. 实例化之前,先检查模板代码本身,查看语法是否正确,在这里会发现错误的语法,如遗漏分号等。
2. 在实例化期间,检查模板代码,查看是否所有的调用都有效。在这里会发现无效的调用,如该实例化类型不支持某些函数调用等。
函数模板有两种类型的参数:
1. 模板参数: 位于函数模板名称的前面,在一对尖括号内部进行声明:
template <typename T>
2. 用参数:位于函数模板名称之后,在一对圆括号内部进行声明:
max(T const& a, T const& b);
可以额根据需要声明任意数量的模板参数。然而,在函数模板内部(这一点和类模板不同),不能指定缺省的模板实参。
当模板参数和调用参数没有发生关联,或者不能有调用参数来决定模板参数的时候,你在调用时就必须显式指定模板实参。然而,模板实参演绎并不适合返回类型,因为RT不会出现在函数调用参数的类型里面,因为,函数调用并不能推导出RT,也就是必须显式地指定模板实参列表。
重载函数模板
inline