20200310
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
包括展的过程是这样的:
- 将 packet 分解成构成的元素
- 对每个元素应用模式(pattern,可以认为就是一个函数)
- 获得扩展后的列表
关于第二点,可以参考上面的例子(wrapper 就是 pattern)。
模板特例化
- 特例化的本质是实例化一个模板,而非重载。
- 不仅函数有模板特例化,类也有模板特例化。
- 对于类,可以进行部分特例化。