深入理解函数模版
函数模版深入理解
编译器从函数模版通过具体类型产生不同的函数
编译器会对函数模版进行两次编译
对模版代码本身进行编译
对参数替换后的代码进行编译
注意事项:
函数模版本身不允许隐式类型转换
自动推导类型时,必须严格匹配
显示类型指定时,能够进行隐式类型转换
函数模版可以定义任意多个不同的类型参数
template
<typename T1, typename T2, typename T3>
T1 Add(T2 a, T3 b)
{
return static_cast<T1>(a+b);
}
对于多参数函数模版
无法自动推导返回值类型
可以从左向右部分指定类型参数
//T1 = int, T2 = double, T3 = double
int r1 = Add<int>(0.5,0.8);
//T1 = int, T2 = float, T3 = double
int r2 = Add<int,float>(0.5,0.8);
//T1 = int, T2 = float, T3 = float
int r3 = Add<int, float, float>(0.5,0.8);
工程中将返回值参数作为第一个类型参数
函数模版可以像普通函数一样被重载
c++编译器优先考虑普通函数
如果函数模版可以产生一个更好的匹配,那么选择模板
可以通过空模板实参列表限定编译器只匹配模板
double r2 = Max<>(0.5,0.8); //限定编译器只匹配函数模板
小结
函数模板通过具体类型产生不同的函数
函数模板可以定义任意多个不同的类型参数
函数模板中的返回值类型必须显示指定
函数模板可以像普通函数一样被重载