函数模板提供了一种函数行为,该函数行为可以用多种不同的类型进行调用,也就是说,函数模板代表一个函数家族,这些函数的元素是未定的,在使用的时候被参数化。
本文地址:,转载请注明源地址。
下面举一个简单的例子:
定义模板:
templateinline T const& max(T const& a, T const& b){ return a < b ? b : a;}
这个模板定义指定了一个“返回两个值中最大者”的函数家族,这两个值通过函数参数a , b传递给函数模板的,而参数的类型还没有确定,用模板参数T来代替。
其中,typename可以用class来代替,但是建议使用typename完整代码如下:
#include#include using namespace std;template inline T const& max(T const& a, T const& b){ return a < b ? b : a;}int main(){ int i = 42; cout<<"max(7, i): "<<::max(7, i)<
实参的选择:
模板参数可以根据我们传递的实参来决定,如果我们传递了两个int给参数类型T const&,那么C++编译器得出结论:每个T都必须正确的匹配,如果此时传递的实参为:max(4, 4.2),则出现编译错误
有3种方法来处理上面的错误:
1、对实参进行强制类型转换,使它们可以互相匹配:
max(static_cast<double>(4), 4.2);
2、显示指定(或限定)T的类型:
max<double>(4, 4.2)
3、指定两个参数可以具有不同的类型
模板参数
函数模板有2种类型的参数:
1、模板参数:位于函数模板名称的前面,在一对尖括号内部进行声明:
template<typename T>
2、用参数:位于函数模板名称之后,在一对圆括号内部进行声明:
...max(T const& a, T const& b)
可以声明任意数量的模板参数,在函数模板的内部,不能指定缺省的参数。
templateinline T1 max(T1 const& a, T2 const& b){ return a < b ? b : a;}...max(4, 4.2);
可以引入第三个模板实参类型,来定义函数模板的返回类型:
templateinline RT max(T1 const& a, T2 const& b);...max (4, 4.2);
行得通,但是很麻烦
还有一种方法是只显示的指定第一个实参,而让演绎过程推导出其余的实参。
templateinline RT max(T1 const& a, T2 const& b);...max (1, 4.2); //ok, 返回类型是double
重载函数模板
和普通函数一样,函数模板也可以被重载,示例代码如下:
#include#include using namespace std;inline int const& max(int const& a, int const& b){ return a < b ? b : a;}template inline T const& max(T const& a, T const& b){ return a < b ? b : a;}template inline T const& max(T const& a, T const& b, T const& c){ return ::max(::max(a, b), c);}int main(){ cout<<::max(7, 12, 67)< (通过实参演绎) cout<<::max('a', 'y')< (通过实参演绎) cout<<::max(7, 42)< (7, 23)<