模板
程序 = 算法 + 数据结构
数据结构 : 能够存储任意类型
算 法 : 能够操作存储任意类型数据的数据结构
泛型编程 :将【任意类型】从程序设计中抽象出来
编写与类型无关的通用代码,是代码复用的一种手段,而模板则是泛型编程的基础。
泛型编程并没有减少实际的代码量,只是把重复的代码交给机器自动生产,减少开发人员重复的工作量,极大的提高工作效率。
优势:
- 模板复用了代码,节省资源,更快的迭代开发,C++的标准模板库(STL)因此而产生
- 增强了代码的灵活性
劣势:
- 模板会导致代码膨胀问题,也会导致编译时间变长
- 出现模板编译错误时,错误信息非常凌乱,不易定位错误
泛型编程 | |
---|---|
面向过程编程 | 用【模板】实现函数过程 |
面向对象编程 | 用【模板】实现类 |
扫描二维码关注公众号,回复:
15058794 查看本文章
template<typename T>
等价于 template<class T>
typename
"typename"是一个C++程序设计语言中的关键字。当用于泛型编程时是另一术语"class"的同义词。这个关键字用于指出模板声明(或定义)中的非独立名称(dependent names)是类型名,而非变量名。
非独立名称就是有依赖关系的名称(个人理解)
typename关键字被引入的理念
在模板定义语法中关键字 class 与 typename 的作用完全一样
那class使用就够了,为什么又引入了新的关键词 typename ,关于这个问题,”Stan Lippman“ 曾在其博客中表示,最早 Stroustrup 使用 class 来声明模板参数列表中的类型是为了避免增加不必要的关键字;后来委员会认为这样混用可能造成概念上的混淆才加上了 typename 关键字。
作用
-
用于在模板参数列表中定义抽象出的数据类型
-
告诉 C++ 编译器,typename 后面的字符串为一个类型名称,而不是成员函数或者成员变量,这个时候如果前面没有 typename,编译器没有任何办法知道 T::type 是一个类型还是一个成员名称(静态数据成员或者静态函数),所以编译不能够通过。
template<typename T> // 作用一
void func(T p) {
typename T::type it(); // 作用二
}
// 同理 class
template<class T>
void func(T p) {
class T::type it();
}