模板参数的声明
template<comma-separated-list-of-parameters> // template<用逗号隔开的参数列表>
模板的定义和实例化
// 模板的定义
template<typename T>
inline T const& max(T const& a, T const& b)
{
return a < b ? b : a;
}
// 实例化
int a = max(1, 2); // 根据实参的类型使用int实例化
float b = max(4.0f, 3.0f); // 根据实参的类型使用float实例化
// 实例化时,编译器会自动生成实例化的代码。比如使用int实例化会生成如下代码:
inline int const& max(int const& a, int const& b)
{
return a < b ? b : a; // int支持a < b的调用
}
模板的编译:
- 实例化之前,先检查模板代码本身,查看语法是否正确;
- 实例化期间,检查模板代码,查看模板实参的所有调用是否都有效。上面的模板实参就必须支持 < 的调用
实参的推导
模板可以根据实参的类型来推导出实例化的类型,但所有的实参必须正确匹配类型,不支持自动转换类型。
template<typename T>
inline T const& max(T const& a, T const& b); // 两个实参的类型相同
// 使用时
max(4, 7); // OK:两个实参的类型都是int,使用int实例化
max(4, 7.0); // ERROR: 两个实参的类型不同,不知道使用哪个实例化
解决方法:
-
对实参使用强制类型转换
max(static_cast<double>(4), 4.2);
-
显示指定实例化的类型
max<double>(4, 4.2);
重载函数模板
inline int const& max(int const& a, int const& b)
{
return a < b ? b : a;
}
template<typename T>
inline T const& max(T const& a, T const& b)
{
return a < b ? b : a;
}
int main()
{
max(2, 3); // 当模板和非模板函数都匹配时,优先匹配非模板函数
max(2.0f, 3.0f); // 模板函数有更优的匹配,调用模板函数
max<>(2, 3); // 显示声明调用模板函数
}