Function Templates

一、定义 Function Template

 

template <typename T>
inline const T& max(const T& a, const T& b)
{
        return a<b ? a : b;
}

 二、参数推导

当使用某一类型的参数调用max()时,模板参数(template parameter)将以调用参数的类型确定下来。如下述代码

int main()
{
      max(4, 7);        // ok, 两个T都被推导为int
      max(4, 4.2);     // error: 第一个T被推导为int,第二个T被推导为double
}

三种方法解决error问题

  1)把两个参数转型为相同数据类型

       max(static_cast<double>(4), 4.2);

  2)明确指定T的类型

       max<double>(4, 4.2);  

  3)修改function template的模板参数为两个不同的类型; 

 

三、模板参数

模板参数有两种:

I: template parameter (模板参数),在function template的一对尖括号里声明;

      template <typename T >

 

II:call parameter,在function template名称后的小圆括号中声明;

      max(const T& a, const T& b );

template parameter的数量不限(如果不觉得难看的话),但是不能在function template预设默认值。

按照3)的方法可以修改max的定义如下

template <typename T1, typename T2>
inline T1 max(const T1& a, const T2& b)
{
      return a<b ? b : a;
}
...
max(4, 4.2);  //比如此处调用返回值类型想为double, 实际返回类型为int。

 上述方法明显有不足之处,返回值必须是参数类型中的一个,而不能动态决定; 另一个不足之处是,由于发生了类型cast,导致临时对象产生,因此返回值不能为引用。

 

由于T的类型由调用参数决定,因此我们把T与call parameter之间的关联,称为function template argument deduction (函数模板参数推导)。这种机制允许调用function template如同调用non-function template一样。当然,developer也可以显示化地指定template parameter的类型,例如

max<double>(4, 4.2);

 不过推导过程,并不包含返回值类型的推导;假如,我们有如下版本的max function template

template <typename T1, typename T2, typename RT>
inline RT max (const T1& a, const T2& b);

max<int, double, double>(4, 4.2); //ok, but redundant.

 在本例中,返回类型RT必须在调用max时明确指定;不过调用起来显得如此拖沓冗长。这样的调用,function template的推导过程要么要求所有的模板参数全部显示指定,要么都不显示指定。但是如果我们修改下max function template的template parameter的顺序,像如下这样

template<typename RT, typename T1, typename T2>
inline RT max (const T1& a, const T2& b);

max<double>(4, 4.2); 

那么调用时,只需指定第一个template parameter就可以了。

 

四、重载Function Template

Function template与non-function template 函数一样,可以重载;

 

小结

1. Function templates 可以针对不同的template arguments定义一整族函数;
2. Function templates 讲依照传递而来的参数的类型而被具现化;
3. 可以明确指出template parameters;
4. Function templates 可以被重载;
5. 重载Function templates时,不同的重载形式之间最好只存在【绝对必要差异】
6. 确保所有形式的重载函数都被写在它们的被呼叫点之前。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值