与类模板类似,函数也可以声明成泛型的形式,这包括了一般的函数和类成员函数。
动手写11.2.1
动手写11.2.1展示了函数模板的语法及应用。运行结果如图11.2.1所示:
图11.2.1 函数模板
本示例实现了max()函数的模板版本。在函数返回值类型之前的部分基本和类模板声明差不多,这个函数对代入类型的唯一要求就是该类型重载了大于操作符,因此我们在传入Interval类型的时候需要看看Interval类有没有重载大于操作符。程序分别展示了基本类型和自定义类版本的两种函数实例化,实例化的时候尖括号放在函数名和参数列表之间。
除了一般函数外,函数模板也适用于类成员函数,甚至是类模板的成员函数。也就是说,类模板的成员函数除了类本身的模板形参之外,还有函数自身带的模板形参。
动手写11.2.2
(www.xing528.com)
动手写11.2.2展示了类模板的成员函数模板的定义。运行结果如图11.2.2所示:
图11.2.2 成员函数模板
本示例定义了一个模板的二维向量,并且在实现成员函数add()的时候引入了另一个模板参数列表,这个参数列表只适用于这个成员函数。我们可以看到,在类定义外定义这样一个成员函数就有些烦琐了,需要将两个模板形参表都放在函数定义前,不然函数可能会找不到使用的类型符号。在main()函数中使用的时候,我们先定义了int类型的向量,然后在做加法的时候分别实例化了int和float两种类型的加法版本。
要注意在这里我们是不能使用“add<Vector2D>()”的,因为那样的话我们是加上向量的各分量x和y。这种函数模板的特殊情况可以通过本章的“知识拓展”中讲解的模板特化解决。
最后我们要介绍模板形参的默认参数,这与函数声明中的默认参数的用法非常相似。
动手写11.2.3
动手写11.2.3展示了模板默认参数的用法。运行结果如图11.2.3所示:
图11.2.3 模板默认参数
在这个矩阵的示例中,mat1没有指定模板参数,因此使用了默认的<int,2,2>,而且构造函数也使用了默认的参数0,最后打印出了一个全零的2x2矩阵。对于模板来说,也可以部分使用默认参数,mat2的前两个参数改成字符串和3,但是列数依然保持着2。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。