推断函数模板返回类型

这一章将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。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值