一、基本概念
Function templates 有两种参数:
1. Template parameters(模板参数),在function template 名称前的一对角(尖)括号中声明:
template <typename T> // T 是个 template parameter
2. Call parameters(调用参数),在 function template 名称后的小(圆)括号中声明:
... max (T const& a, T const& b); // a 和 b 是调用参数
二、自变量推导例子
1、一般推导方式
template <typename T1, typename T2>
inline T1 max (T1 const& a, T2 const& b) {
return a < b ? b : a;
}
...
max(4, 4.2); // OK。返回类型和第一自变量类型相同
2、带有函数返回值的推导方式(1)
当template parameters和call parameters之间没有明显联系,而且编译器无法推导出template arameters 时,你必须明确地在调用时指定template arguments。例如你可以为max()引入第三个 template argument type 作为返回类型:
template <typename T1, typename T2, typename RT>
inline RT max (T1 const& a, T2 const& b);
...
max<int,double,double>(4, 4.2);
// OK,但是相当冗长(译注:因为其实只需明写第三自变量类型,却连前两个自变量类型都得写出来)
3、带有函数返回值得推导方式(2)
另有一种作法是只明确写出第一自变量,剩下的留给编译器去推导,你要做的只
是把所有无法被自动推导出来的自变量类型写出来。
template <typename RT, typename T1, typename T2>
inline RT max (T1 const& a, T2 const& b);
...
max<double>(4,4.2); // OK,返回类型为 double
此例之中,我们调用 max()时,只明确指出返回类型RT 为double,至于T1 和T2 两个参数类型会被编译器根据调用时的自变量推导为int 和 double。