#### 为什么需要模板
---
很多人会很疑惑,明明可以用重载等方式就可以实现需求,那为什么要学习模板这种十分艰涩的知识呢?
> 首先,模板确实不好学
无论是从模板的定义来说,还是从模板的各种偏特化,特化,SFINAE等技巧而言,模板对于C++初学者而言,并不是那么友好.
并且对于初学者而言,他们最讨厌的也莫过于是报错,尤其是模板那一大块冗长复杂的错误信息,很多人看到一处报错就会望而生畏.
> 其次,模板很强大
使用模板以及模板相关的编程技巧,可以使得代码去生成代码,将程序员从繁杂的手工编写代码中释放.
```
当然本文不会涉及如果模板写的不好,还得花时间去改写这种存在的事实,因为已经超出讨论的范畴.
```
---
##### 简单的样例
假定我们有很多个类型需要去实现**相似的功能**
比如,我们要实现不同类型的链表
> 使用模板的方式
```c++
template <typename Type>
struct Item
{
Type value;
Item *next;
};
template <typename Type>
class List
{
public:
....
private:
Item<Type> head_;
};
int main()
{
List<int> il;
List<double> dl;
return 0;
}
```
> 不使用模板的方式
不用模板的话大致有这样几种方法
1. 枚举所有类型
2. 使用void*
3. 宏
囿于篇幅只介绍一种利用宏来实现的,当然这种还是不建议使用
```c++
#define GetType(Type) Item##Type
#define Generate(Type) \
struct GetType(Type) { \
Type value; \
struct GetType(Type) * next;\
}
Generate(int);
Generate(double);
int main()
{
GetType(int) il;
il.value = 8;
il.next = nullptr;
return 0;
}
```
----
##### 对比
从排版上来说,也是模板实现的更加易读
而且宏的话,对于大部分初学者而言也是极其难以控制的