C++中函数模板的返回值是模板类型参数的调用方法

1 函数模板
模板定义以关键字template开始,后接模板形参表,模板形参表是用尖括号扩住的一个或多个模板形参的列表,形参之间以逗号分隔。关于函数模板的详细介绍,请参考《C++中模板函数及模板类的使用(上)》。

2 函数模板的返回值是模板类型参数
函数模板中的参数和返回值都可以是模板类型参数。编译器必须通过调用函数模板的实参来推断模板类型参数的具体类型。但是,当函数模板的返回值是模板类型参数时,编译器无法通过函数调用来推断返回值的具体类型。此时,在调用函数时必须提供一个显式模板实参(explicit template argument)。

3 显式模板实参
显式模板实参在尖括号中给出,位于函数名之后,实参列表之前。显式模板实参按由左向右的顺序与对应的模板参数匹配。例如

template<typename T1, typename T2, typename T3>
 
T1 myFunc(T2, T3);


此时,调用myFunc()函数模板的代码为

myFunc<int, char, float>(‘1’, 0.1F);


此时,T1的类型是int,T2的类型是char,T3的类型是Float。

如果可以从调用函数的实参中推断出来T2和T3的类型,则可以从显式模板实参的尾部开始,从右向左依次省略。例如,以上调用函数的代码还可以写成

myFunc<int>(‘1’, 0.1F);
此时,T2和T3的类型可以通过函数的实参进行推断。

4 实战
在CSDN论坛中有朋友提到以下问题

template <class  t1, class  t2>
 
t1 fun(t2 x, t2 y) {
 
if (x > y)
 
cout << x;
 
else 
 
return x;
 
}


此时,调用fun()函数,

fun(5, 6);
此时,编译工具会提示“没有与参数列表匹配的参数模板”。产生以上问题的主要原因就是编译器无法推断出t1的类型。可以使用指定显式模板实参的方法解决。

fun<int,int>(5, 6)


或者

fun<int>(5, 6)


 
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值