20200310

@ShiKaiWi

Plan

60min: cpp 模板

Notes

函数模板的重载

  • 函数模板会被另一个模板或一个非模板函数重载
  • 匹配的非模板函数的匹配优先级高于模板函数,匹配的特立化的模板函数优先于模板函数

可变参数模板

几个名词:

  • variadic template
  • parameter packet
  • template parameter packet
  • function parameter packet

实现的时候,往往会出现递归处理:

#include <iostream>
#include <sstream>

template <typename T> std::string wrapper(T &t) {
  std::ostringstream s;
  s << "(" << t << ")";
  return s.str();
}

template <typename T> void print(T t) { std::cout << t << std::endl; }

template <typename T, typename... Args> void print(T t, Args... rest) {
  std::cout << t << ", ";
  print(wrapper(rest)...);
}

int main() {
  print(1, 2, 3, 4);
  print("hello", "world");
  return 1;
}

expansion

包括展的过程是这样的:

  1. 将 packet 分解成构成的元素
  2. 对每个元素应用模式(pattern,可以认为就是一个函数)
  3. 获得扩展后的列表

关于第二点,可以参考上面的例子(wrapper 就是 pattern)。

模板特例化

  • 特例化的本质是实例化一个模板,而非重载。
  • 不仅函数有模板特例化,类也有模板特例化。
  • 对于类,可以进行部分特例化。

More