泛型编程
-
基本概念
①.泛型:就是不使用具体数据类型,而是使用一种通用类型 T 来进行程序设计;T 只是一个占位符,实际在 T 的位置真实的数据类型取决于用户的需求;占位符的替换由编译器在编译阶段完成。
②.泛型编程:为了避免因数据类型的不同,而被迫重复编写大量相同业务逻辑的代码,因此发展了泛型及泛型编程技术;泛型编程就是独立于任何特定类型的方式编写代码,常用到STL容器、迭代器、和算法都是泛型编程的例子。
-
模版
①.概念:模版是 C++ 泛型编程的基础,一个模版就是一个创建类或者函数的蓝图。
②.实例化:编译器用推断出的模版参数来为我们创建一个特定版本的函数实例,整个过程发生在编译阶段。
-
与面向对象编程比较
①.多态
面向对象编程支持运行期多态,如 virtual 函数的动态绑定发生在运行期;泛型编程支持编译期多态,在编译器根据模版实例出针对不同类型的具体代码。
②.接口
面向对象编程支持显式接口,是由函数名称、参数类型、返回类型构成;泛型编程支持隐式接口,是基于有效的表达式推断出来的。
-
typename
①.声明模版参数
可以使用 class 或者 typename 声明模版参数,二者含义相同,可用互换。
template<class T> class Widget;//使用 class template<typename T> class Widget;//使用 typename
②.声明从属嵌套类型
当声明一个从属嵌套类型时,必须使用 typename 关键字,告诉编译器这是个类型。因为我们可以用域作用符 :: 来访问 static 成员和类型成员,在模版代码中,编译器遇到 T:: x 时,会默认假定访问的成员名字而不是类型。
template<typename C> void Print2Nd(const C& container) { typename C::const_iterator iter(container.begin()) //确认是类型不是名称 }