模板的参数分为模板参数和调用参数。
例如:
template <typename T1, typename T2, typename T3>
inline T1 max(const T2 a, const T3 b)
{
//TODO: 代码实现 ...
}
其中,第一行定义了模板参数,第二行定义了模板的调用参数。需要注意的是返回值并不属于模板的调用参数。
下面以实例讲解一下模板参数:
#include<stdio.h>
template <typename T> // 只定义一个模板参数。
inline T max(const T a, const T b)
{
return a < b ? b : a;
}
template <typename T>
inline T max1(const T a, const T b)
{
return a < b ? b : a;
}
inline int max1(const int a, const int b)
{
// 为了便于区分,让返回结果+100
return a < b ? b+100 : a+100;
}
template <typename T1, typename T2, typename T3> // 从左至右定义了三个模板参数。
inline T1 max2(const T2 a, const T3 b)
{
return a < b ? b : a;
}
void main()
{
int i;
double d;
// 不指定模板参数,隐式实例化模板。虽然没有显示地模板参数,但编译器自动推导出函数模板参数为int。
i = max(42, 66);
printf("i = %d\n", i);
// 如果非模板函数和推导后的模板函数一样,会产生什么结果呢?下面调用的究竟是模板函数还是非模板函数呢?
// 实际是这样的,首先查看是否有满足要求的非模板函数,如果没有,再根据参数去匹配并实例化相应的模板函数,所以这里调用的应该是非模板的max1函数。
i = max1(42, 66);
printf("i = %d\n", i);
// 指定模板参数,显示实例化模板。
d = max<double>(4, 4.2);
printf("d = %f\n", d);
// 使用部分缺省的模板参数,不用指定全部的模板参数。如下,从左到右地指定一部分参数,只指定第一个返回参数,即要求返回double类型。
// 由于返回参数不属于调用参数,所以必须明确的指出它的类型;而T1和T2属于调用参数,编译器能从函数调用中推导出来。
d = max2<double>(4, 4.2);
printf("d = %f\n", d);
getchar();
return;
}