C++ | 模板相关

清晰概念

类模板和模板类

  • 类模板表示是一个模板,可以用此模板产生其他模板类
  • 模板类是由模板而产生的类

函数模板和模板函数

  • 模板函数重点是模板,表示他是一个模板,用来产生模板函数
  • 模板函数就是用模板刻出来的函数

运行机制

1.编译器会对函数模板进行两次编译

(在声明的地方对模板代码本身进行编译;在调用的地方再对参数替换后的代码进行编译。)

2.编译器在对函数模板编译时与调用的次数无关,与调用时参数类型有关

实例化和具体化

实例化

在代码中包含函数模板本身并不会生成函数定义,他只是用于生成函数定义的方案…编译器使用模板为特定类型生成函数定义时,得到的是模板实例,模板并非函数定义,但模板实例就是进行定义,这种叫隐式实例化.
现在C++支持显示实例化,比如fun,意思是使用fun()模板生成一个使用int类型的实例

具体化

显式具体化的形式为template <> void fun(int) || template <> void fun(int);
这些声明的意思是不能用模板产生函数定义而应该使用专门为int类型显式地定义的函数定义,具体化之后可以看为一个正常的fun(int)函数来使用…

编译器如何选择最佳函数

对于重载,函数模板和函数模板重载,需要有一个良好的策略来确定使用哪一个函数定义,这个过程称为重构解析.

  1. 创建函数候选列表
  2. 使用候选函数列表创建可行函数列表
  3. 确定最佳可行函数
    可行函数从最佳到最差
  4. 完全匹配
  5. 提升转换
  6. 标准转换
  7. 用户自定义的转换

函数模板重载

  1. 函数模板可以像普通函数一样被重载
  2. C++编译器优先考虑普通函数
  3. 如果函数模板可以产生一个更好的匹配,则选择模板
  4. 可以通过空模板实参列表的语法限定编译器只通过模板匹配
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值