17.模板
1.类模板

2.函数模板

3.成员模板

4.模板特化

泛化:
它对任意类型 Key 都有效,但里面什么都没实现
意思是:“对于任何我不知道怎么算哈希值的类型,我先提供一个空框架。”
这叫泛化版本(generalization),因为它适用于“所有可能的 Key”,是最广义的、默认的版本。
如果你用一个没有特化的类型去实例化它,编译会报错(因为 operator() 没定义),这正是需要特化的信号。
特化:
这些是对特定类型进行的特化。
template<> 表示“我要特化一个已经存在的模板”,尖括号里不写参数,后面紧跟具体类型(如
意思是:“当 Key 具体是 char/int/long 的时候,不要用上面的空泛化版本,而是用我这里专门为它写的实现。”
这些特化版本提供了真正的 operator(),能把值直接当作哈希值返回(简单起见,实际标准库更复杂)。
5.模板偏特化--个数的偏
全特化:把所有模板参数都固定死。
偏特化:只固定“一部分”模板参数

6.模板偏特化--范围的偏

7.模板模板参数
普通模板参数是类型(如 int、string、MyClass*),但有时候我们需要传的不是一个普通类型,而是一个本身就是模板的类(比如 list<T, Alloc>、vector<T, Alloc> 这种带模板参数的容器)。


浙公网安备 33010602011771号