02 函数模板

1. 声明type parameter 最好使用关键字typename,不能使用关键字struct
可以使用关键字class 代替关键字typename 来定义一个type parameter,就语义而言,前后两者毫无区别。
最好使用关键字typename,声明type parameter 时我们不能把关键字typename 换成关键字struct。

2. templates 会被编译两次
实际上,templates 会被编译两次:
1. 不实例化,只是对template 代码进行语法检查以发现诸如"缺少分号"等语法错误。
2. 实例化时,编译器检查template代码中的所有调用是否合法,诸如"不支持的函数调用(如未实现重载<)",便会在这个阶段被检查出来。

3. 参数推导
当我们使用某一类型参数调用max()时,template parameters 将以该参数类型确定下来。
注意,这里并不允许"自动类型换转",每个T都必须完全匹配器参数。

有三种方法可以解决上述问题:


4.不能在function templates 中指定预设的参数值(这点和class templates 不同),例如:
template <typename T,int N=10>
inline T Sum(const T& val)
{
    return val+N;
}
当像如下调用时:
printf("sum: %d\n",Sum<int>(2));
编译器会报错:


但c++11已经解决了函数模板不能指定预设值的问题,需要在编译时指定:
g++ -std=c++11 -c -g -Iinclude main.cpp -o main.o

5. (重载)函数模板


使用 typeid(T).name() 打印结果:


当其他要素都相等时,重载优先选择non-template function。如:::Max(7,42);
如果可由template 产生更加匹配,则template 实例化会被编译器选中。如:::Max('a','b');
调用端也可以使用空的template argument list 这种形式告诉编译器"只从template 实例化中挑选适当的呼叫对象"。如:::Max<>(7,42);
另外,"自动类型转换"只适用于常规函数,在template 中不予考虑。如:::Max('a',42.7); // 只有non-template 函数才可以接受两个不同类型的参数
然而,"参数推导机制"并不对返回类型进行匹配,而且上述的RT 也并非函数调用参数(call parameters)中的一个:因此编译器无法推导出RT。你不得不像这样明确指出template arguments:


另一种做法是只明确返回类型,由编译器推掉剩余的类型:


6. 指针和C-type字符串类型重载Max() template


使用 typeid(T).name() 打印结果:


7. 以一个"by value 形式的Max()"替换一个"by reference 形式的Max()",就会发生副作用


像如下调用"三参数"的Max():


编译器则会发出警告:


如果以一个"by value 形式的Max()"重载一个"by reference 形式的Max()",编译器则会报错:

摘要:
1. Funciton template 可以针对不同的template arguments 定义一整族(a family of)函数。
2. Funciton template 将依照传递而来的参数(arguments)的类型而被实例化(instantiated)。
3. 你可以明确指出template parameters。
4. Funciton template 可以被重载(overloaded)。
5. 重载funciton template 时,不同的重载形式之间最好只存在"绝对必要的差异"。
6 请确保所有形式的重载函数都被写在他们被调用点之前。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值