泛型编程:模板函数(完)

概述

  1. 函数模板使用泛型来定义函数,其中的泛型可用具体类型替换
  2. 函数模板并不创建任何函数,而只是告诉编译器如何定义函数
  3. 模板函数的参数类型并非只能是模板类型,可以是非模板数据类型
  4. 模板函数可以被重载(),即函数名相同,函数特征标不同
template <typename 泛型名称>
返回值类型 函数名(参数类型)
{
	...
}

在这里插入图片描述
在这里插入图片描述

实例化与具体化

  1. 具体化实例化是不同的:
    (1)实例化是指编译器使用模板函数特定类型生成函数定义
    (2)具体化是指缩小模板函数模板参数的范围,如使用具体类型替换模板参数类型
    (3)具体化后仍然不是函数定义,实例化后一定是函数定义
  2. 实例化:
    (1)隐式实例化: 函数调用时由编译器创建特定的实例
    (2)显式实例化: 直接命令编译器创建特定的实例
  3. 显式实例化声明时,只有关键字template而不包含<>
  4. 显示实例化不能有函数定义,而具体化必须有函数定义
  5. 试图在同一个文件将同一种类型的显式实例化放在显式具体化前面将出错

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

重载解析

  1. 重载解析: 对于函数、函数模板及其重载版本,需要一个良好的策略,来决定使用哪个定义
  2. 对于给定的函数名,可以有非模板函数模板函数显式具体化模板函数以及它们的重载版本
  3. 一般而言,具体化优先于常规模板,而非模板函数优先于具体化常规模板
  1. 解析过程:
    (1)创建候选函数列表: 包含与调用函数的名称相同的函数与模板函数
    (2)使用候选函数类别创建可行函数列表: 参数数目正确的函数,为此有一个隐式转换序列,其中包括实参类型与相应的形参完全匹配的情况
    (3)确定是否有最佳的可行函数: 如果有,则使用它,否则该函数调用出错
  2. 重载解析只考虑函数特征标,而不考虑函数返回类型
  3. 编译器在确定哪个函数是最佳的需要查看为使函数调用参数与可行的候选函数的参数匹配所需要进行的转换,从最佳到最差的顺序如下:
    (1)完全匹配,但常规函数优先于模板
    (2)提升转换: eg: char转为int
    (3)标准转换: int转为charlong转为double
    (4)用户自定义的转换:,如类声明中定义的转换
  • 最佳匹配和完全匹配:
  1. 进行完全匹配时,C++允许某些“无关紧要的转换”
  2. 对于指针与引用,指向非const数据的指针和引用优先与非const指针和引用参数匹配
  3. 同为完全匹配非模板函数优先于模板函数(包括显式具体化)

在这里插入图片描述

  1. 若两个完全匹配的函数都是模板函数,则较为具体的模板函数优先

在这里插入图片描述

关键字decltype

  • 使用关键字decltype:
  1. 语法: decltype(expression) var;

在这里插入图片描述

  • 类型确定:
  1. expression是一个没有用括号括起的标识符,则var的类型与该标识符类型相同
  2. expression是一个函数调用,则var的类型与函数返回值的类型相同(并不会调用函数,而是通过查看函数原型确定)
  3. expression是一个左值,且用()括起时,则var为指向其类型的引用
  4. 若前面条件都不满足,则var的类型与expression的类型相同

在这里插入图片描述

  • typedefdecltype:
  1. 若需要多次声明,可结合typedefdecltype

在这里插入图片描述

  • 后置返回类型与decltype
  1. 后置返回类型: 将返回类型移到了参数声明的后面
  2. auto为一个占位符,表示后置返回类型提供的类型

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

m0_46427273

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值