2000字范文,分享全网优秀范文,学习好帮手!
2000字范文 > C++中函数模板的返回值是模板类型参数的调用方法

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

时间:2022-11-15 06:46:28

相关推荐

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<classt1, classt2>t1fun(t2x, t2y) {if(x> y)cout << x;elsereturnx;}

此时,调用fun()函数,

fun(5, 6);

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

fun<int,int>(5, 6)

或者

fun<int>(5, 6)

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。