background image

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+

+编译器继续使用强类型系统编译这个函数,由强类型系统来检查这个函数是
否正确。

  这个过程叫做模板的 特化 ,它发生在编译期,当编译器发现模板函数、
模板类被使用(注意,不是定义)的时候进行的。这个系统实际上比较像宏,
但是比宏更为智能。

  很明显,编译器必须知道模板如何特化这个函数,因此模板函数的实现,

必须在 使用点 之前,因此模板库只能通过头文件库的形式来提供。