#### 為什么需要模板
---
很多人會很疑惑,明明可以用重載等方式就可以實現需求,那為什么要學習模板這種十分艱澀的知識呢?
> 首先,模板確實不好學
無論是從模板的定義來說,還是從模板的各種偏特化,特化,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;
}
```
----
##### 對比
從排版上來說,也是模板實現的更加易讀
而且宏的話,對于大部分初學者而言也是極其難以控制的