多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
#### 为什么需要模板 --- 很多人会很疑惑,明明可以用重载等方式就可以实现需求,那为什么要学习模板这种十分艰涩的知识呢? > 首先,模板确实不好学 无论是从模板的定义来说,还是从模板的各种偏特化,特化,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; } ``` ---- ##### 对比 从排版上来说,也是模板实现的更加易读 而且宏的话,对于大部分初学者而言也是极其难以控制的