GeekBand.重学C++(5)----STL

0x00. 模板简介

  • 两种模板:类模板和函数模板
  • 代码重用:允许函数和类以泛型的形式表现和运行,针对各种类型都适用,而无需为每种类型单独写一份代码
  • 模板实例化
    • 模板声明:未给出雷和函数的完全定义,只是给出了函数和类的语法框架
    • 实例化:从模板构建出完全定义的函数和类
      • 显示实例化:代码中明确指定模板参数
      • 隐式实例化:自动推导模板参数
  • 模板定义
    • 声明模板参数时,使用 class 和 typename 均可,但是不能使用 struct

0x01. 函数模板

  • 模板被编译两次:
    • 没有实例化之前,检查模板代码本身是否有语法错误;
    • 实例化期间,检查对模板代码的调用是否否合法。
  • 参数推导
    • 模板参数,是由传递给模板函数的实参决定的
    • 不允许自动类型转换
    • 解决方式1:static_cast 强制类型转换
    • 解决方式2:显示指定模板参数
  • 函数模板重载:
    • 模板函数与普通函数可以共存
    • 重载函数裁决:优先非模板函数,而不是从模板实例化
    • 允许空模板参数列表
    • 模板参数推导,找不到匹配的函数时,只能调用非模板函数(实参可以进行自动类型转换)

0x02. 类模板

  • 类模板参数,可以是某个型别或者一个变量(int/enum),变量可以有默认值
  • 类模板的声明和实现中,如果需要用到类本身,需要使用模板类的完整定义(带模板实参)
  • 模板参数如果带有 <> 符号, 应该在中间加空格:Stack >
  • 类模板的特化
  • 偏特化

你可能感兴趣的:(GeekBand.重学C++(5)----STL)