什么是函数模板?
函数模板提供了一种函数行为,该函数行为可以用多种不同的类型进行调用,它和普通函数很相似,唯一的区别就是有些函数元素是未确定的,这些元素将在使用时被参数化。
一个简单的函数模板
template <typename T>
inline T const& max(T const&a, T const&b)
{
return a<b?b:a;
}
只要使用函数模板,编译器会自动地引发一个实例化过程,使用者不需要额外地请求模板的实例化。
编译过程中,模板会被编译两次,分别是:
- 实例化之前,先检查模块代码本身,查看语法是否正确,比如遗漏;等错误是在这里发现的。
- 实例化期间, 检查模块代码,查看是否所有的调用都有效。
一定要让所有的函数模板的声明在被调用的位置之前!
重载函数模板实例化顺序
- 一个非模板函数和一个同名的模板函数同时存在时,一般条件相同时会先实例化非模板函数
- 然而,如果模板可以产生一个更好匹配的函数,那么将选择模板
- 可以显示地指定一个空的模板实参列表,表明只有模板来匹配该调用, 而且所有的模板参数都应该根据实参演绎出来
- 模板不允许自动类型转换;但是普通函数可以进行自动类型转换,所以调用需要自动类型转换的将使用非模板函数。
网友评论