C++模板基础谈
1. 什么是模板模板定义:模板就是实现代码重用机制的一种工具,它可
以实现类型参数化,即把类型定义为参数,从而实现了真正的代码可重用性。
我们知道,
C++
“
”
是一种 强类型 的语言,也就是说一个变量,编译器必
须确切的知道它的类型,而模板就是构建在这个强类型语言基础上的泛型系
统。
2. 模板的语法模板函数 template< typename {类型参数名称}
, [ int
{Name}=……][ ……
,
] > {函数定义}
模板类 template< typename ……
, [ int {Name}=……] > class
……
模板的参数可以是类型,或者是一个 int 型的值(或者可以转换为 int 型
的,比如 bool)。
3.
模板的使用显式类型参数:对于模板函数,在函数名后添加 < {类型
参数表} >.
对于模板类,在类后添加 < {类型参数表} >隐式类型参数:对于
模板函数,如果类型参数可以推导,那么可以省略类型参数表举个例子:
template< typename T > T max
( T a
, T b )
{ return a < b
? b
: a;}
这个 max
“
”
函数就是一个模板函数,它可以传入一个 类型 的参数,以
便实现任意类型求最大值的效果。假设我们这样使用它:int x=5
, y=10;
int z=max<int>
( x
, y
“
);这时候发生了什么呢?我们传入的 类型参
”
数 是 int
,因此编译器在编译这段代码时会使用 int 来构造一个新函数:int
max
( int a
, int b )
{ return a < b
? b
: a;}后面的事就和编译普通的函数一样了,C+
+编译器继续使用强类型系统编译这个函数,由强类型系统来检查这个函数是
否正确。
“
”
这个过程叫做模板的 特化 ,它发生在编译期,当编译器发现模板函数、
模板类被使用(注意,不是定义)的时候进行的。这个系统实际上比较像宏,
但是比宏更为智能。
很明显,编译器必须知道模板如何特化这个函数,因此模板函数的实现,
“
”
必须在 使用点 之前,因此模板库只能通过头文件库的形式来提供。