这一章将auto和函数模板相结合、、、
自动类型推导
template <typename T>
int ave(Ta,Tb)
{
return (a+b)/2
}
int a{100};int b{200};
ave(a,b)
这里会自动将T类型推导为int类型
重要提示*:模板发生自动类型推导时,不会发生隐式类型转换
比如
template <typename T>
int ave(Ta,Tb)
{
return (a+b)/2;
}
int a{100};
char b{200};
ave(a,b);
这段代码就会报错,因为无法确定T到底是char还是int型
显示指定类型
template <typenameT1,typenameT2,typenameT3>
T1 ave(T2 a,T3 b)
{
return (a+b)/2;
}
int main()
{
std::cout<<ave<int>(100,200.00f,200);
}
这里我们强制指定了T1的类型,剩下的T2,T3是自动类型推导,根据200.00f和200自动推导出T2,T3类型。
原理就是<>提供了接口,所以我们可以强制指定T1,T2,T3的类型
重要提示*:如果没有相对应的类型,那么就不会匹配这个模板
template <typename T1,typename T2>
T2 ave (T1 a,T2 b)
{
return (a+b)/2;
}
int main()
{
int a{1000000000};
char b{50};
std::cout<<ave(a,b);
}
如遇到这种情况,ave发生了自动类型推导,T1 为int,T2为char,ave自动类型推导返回值是char,而很明显,这个函数结果不为char类型,是一个int型,因为一个int和char相加,结果肯定为int类型,要先把char转成int才能进行运算,那么返回值类型对不上,就会遇上数值不对的情况,我们有两种办法可以解决,一种是用上面的显示类型转换,另一种就是auto推断
auto推断
C++14标准
decltype(auto) ave<T1a,T2b>
{
return (a+b)/2;
}
不过在某些情况下,decltype返回的却不是引用类型
template<typename T1,typename T2>
decltype(auto) bigger(T1 &a,T2 &b)
{
return a>b?a:b;
}
int main()
{
float a{1.00};
int b{50};
std::cout<<bigger(a,b);
}
特别注意*: 在这里,bigger的返回值结果被隐式类型转换成了float,因为float和int进行运算,结果肯定是float类型,这里应该返回的是float &b,但是b是一个int类型的变量,不能指向一个float 的引用,所以在这种情况下,返回值的类型仅仅为float。