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)

 

©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页