![Visual C++从入门到精通(第5版)](https://wfqqreader-1252317822.image.myqcloud.com/cover/338/27563338/b_27563338.jpg)
4.3 函数模板
函数模板提供了一种机制,使函数的返回值、参数类型能够被参数化,而函数体保持不变。这极大地增强了函数的灵活性。例如,编写一个函数,能够实现两个整数相加,返回值为整数;能够实现两个实数相加,返回值为实数……使用函数模板可以轻易地实现这样的一个函数。本节将详细介绍有关函数模板的相关知识。
4.3.1 定义和使用函数模板
C++语言提供了template关键字用于定义模板。下面以编写一个求和函数为例介绍如何使用template定义函数模板。
![](https://epubservercos.yuewen.com/771DC2/15825992505222206/epubprivate/OEBPS/Images/Figure-P136_35130.jpg?sign=1739309447-FXJje0fRImV7bDiAXbwm7EKcgSbU3n8I-0-4eb407af97c964dd3f5b0ebc450a9470)
其中,template为关键字,表示定义一个模板(可以是函数模板或类模板,类模板将在第5章进行介绍)。尖括号<>表示模板参数。模板参数主要有两种,一种是模板类型参数,另一种是模板非类型参数。上述代码中定义的模板使用的是模板类型参数,模板类型参数使用关键字class或typedef开始(本例使用的是class,也可以使用typedef代替。在定义函数模板时,class与typedef关键字的作用是相同的),其后是一个用户定义的合法的标识符(本例为type,也可以是其他合法标识符)。模板非类型参数与普通参数定义相同,它通常为一个常数,如标识数组的长度。
在定义完函数模板后,需要在程序中调用函数模板。下面的代码演示了Sum函数模板的调用。
![](https://epubservercos.yuewen.com/771DC2/15825992505222206/epubprivate/OEBPS/Images/Figure-P136_35155.jpg?sign=1739309447-k0nQZpzzvw6zp406GHEcflYvVRfXWpJT-0-95f804bf65048f4d7b0b57f9c84a1a95)
如果采用如下形式调用Sum函数模板,将会出现错误。
![](https://epubservercos.yuewen.com/771DC2/15825992505222206/epubprivate/OEBPS/Images/Figure-P136_35165.jpg?sign=1739309447-sOh6fppYYAK5BaK9tPWm2f61XtHHGb41-0-cff9a5e711f2557bd3fdf5bde8594457)
在上述代码中,为函数模板传递了两个类型不同的参数,编译器产生了歧义。如果用户在调用函数模板时显示标识模板类型,就不会出现错误了。例如:
![](https://epubservercos.yuewen.com/771DC2/15825992505222206/epubprivate/OEBPS/Images/Figure-P136_35175.jpg?sign=1739309447-VCV9ZvjkU2bHtr46LgNiyzQRKQgv9Iuv-0-9c46c2649ffce80c51ca74eb9789a951)
下面再定义一个函数模板,实现获取数组元素的最大值。
【例4.26】 定义函数模板,获取数组元素的最大值。
![](https://epubservercos.yuewen.com/771DC2/15825992505222206/epubprivate/OEBPS/Images/Figure-P136_35185.jpg?sign=1739309447-3mrUOAluRFMsR2sFS54fM6N9jOdNoqgD-0-4a48673966c7a69534b361f10570f670)
上述代码定义了一个函数模板Max,其中模板参数使用了模板类型参数type和模板非类型参数len。下面的代码演示了函数模板Max的调用。
![](https://epubservercos.yuewen.com/771DC2/15825992505222206/epubprivate/OEBPS/Images/Figure-P137_35256.jpg?sign=1739309447-sQgGRffUjuNgF86DxBpBwYOg8bjeF3kD-0-4d2ee2cec27eeda5c864de6040fb41d6)
4.3.2 重载函数模板
函数可以重载,同样,函数模板也可以重载。下面的代码定义了两个重载的函数模板。
【例4.27】 定义重载的函数模板。(实例位置:资源包\TM\sl\4\13)
![](https://epubservercos.yuewen.com/771DC2/15825992505222206/epubprivate/OEBPS/Images/Figure-P137_35276.jpg?sign=1739309447-Clzw2SxuNQxzQ2lVwy1Wag0IreQAPJ4C-0-c66f026ac8ff0817c657a7299930fb23)
上述代码中定义了两个重载的函数模板Sum,第1个Sum函数模板实现了两个数的求和运算,第2个Sum函数模板实现了数组元素的求和运算。下面的代码演示了重载函数模板的调用。
【例4.28】 调用重载的函数模板。(实例位置:资源包\TM\sl\4\13)
![](https://epubservercos.yuewen.com/771DC2/15825992505222206/epubprivate/OEBPS/Images/Figure-P137_35351.jpg?sign=1739309447-RnMXj4W0BA96xUOqEMrWIObelxn26qEu-0-e500b0087b31da3224e6d215014aceb4)
执行上述代码,结果如图4.10所示。
![](https://epubservercos.yuewen.com/771DC2/15825992505222206/epubprivate/OEBPS/Images/Figure-P137_35398.jpg?sign=1739309447-F8igMyXqVyFSIsUGmuDLM39gPvjcKg9p-0-8225b5a049333b58c117b4773c892a80)
图4.10 重载函数模板