【第十六章】模板实参推断

本文聚焦C++中函数模板显式推断。当函数模板返回类型需用户指定时,模板参数顺序很重要。如sum函数调用时指定T1类型,可能因参数类型不匹配需隐式转换,还存在编译器无法推断T3类型的情况,指定显式模板实参时类型与参数顺序一一对应。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

二、模板显式推断

在C++中,若函数模板返回类型需要用户指定,那么在定义函数模板时,模板参数的顺序是很重要的,如下代码:

template <typename T1, typename T2, typename T3>  //模板一
T1 sum(T2 a, T3 b)
{
    return a + b;
}

在调用的时候就需要指定T1的类型,如:sum<float>(1,2);于是sum函数的返回类型为float。但是有时候由于设计者的糟糕设计,会导致一些问题:

template <typename T1, typename T2, typename T3> //模板二
T3 sum(T1 a, T2 b)
{
    return a + b;
}

那么再进行上述调用,则会出现问题:sum<float>(1, 2);现在这个调用里指定T1类型为float,但是实际传进来的是1(int类型),会进行隐式类型转换,将1转换为float;T2的类型也可以根据sum(1,2)调用的第二个实参推断出来,这里是可能会是int。那么T3是什么类型呢?显然这里编译器无法推断T3的类型,需要在调用时指定才能推断:

sum<int, int, int>(1, 2); //这样T3就推断出来是int。

在指定显示模板实参时指定的类型是和模板参数匹配的,顺序是一一对应的,如:

  • 使用sum<int>(1, 2)对上面的第一个模板进行调用,那么T1对应int,T2和T3则通过推断得出。
  • 使用sum<int>(1, 2)对上面的第二个模板进行调用,那么T1对应的类型是int,T2可以根据实际穿进去的参数进行推断,这里2为int那么T2类型就是int,那么编译器就无法知道T3的实际类型了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值