模版是泛型编程的基础,我们所编写的类和函数能够多态地用于跨越编译时不想关的类型。一个类或一个函数可以用来操纵多种类型的对象。以下是一些模版的总结:
一、模版的定义
1、 模版形参可以是表示类型的类型形参,也可以表示常量表达式的非类型形参。
2、 函数模版定义:template <typename T>int compare(const T &v1,const T &v2)
3、 类模版可以定义数据成员、函数成员和类型成员。
类模版定义:template<class Type> class Queue
{ Type &front();
Void push (const Type &); }
4、 如果是类型形参,我们就知道该形参表示未知类型,如果是非类型形参,我们就知道它是一个未知值。用作模版形参的名字不能在模版内部重用,每个非类型形参前面必须带上类型名字。
5、 如果拿不准是否需要以typename指明一个名字是一个类型,那么指定它是个好主意。模版非类型形参是模版定义内部的常量值。
二、实例化
1、 类模版的每次实例化都会产生一个独立的类类型。
2、 想要使用类模版,就必须显式指定模版实参。 Queue <int> qi;
3、 多个类型形参的实参必须完全匹配,类型形参的实参的转换受限
4、 在某些情况下,不可能推断模版实参的类型。有必要覆盖模版实参推断机制,并显式指定为模版形参所用的类型或值。
三、类模版成员
1、 类模版中的友元声明
A、普通非模版类或函数的友元声明,将友元关系授予明确指定的类或函数。
B、 类模版或函数模版的友元声明,授予对友元所有实例的访问权。
C、 只授予对类模版或函数模版的特定实例的访问权的友元声明。
2、 任意类可以拥有本身为类模版或函数模版的成员,这种成员成为成员模版,可以定义在包含它的类或类模版定义的内部或外部。
3、 成员模版有两种模版形参:由类定义的和由成员模版本身定义的。
四、模版特化与重载
1、 模版特化是一种特化的定义,它定义了模版的不同版本,将一个或多个形参绑定到特定类型或特定值。‘
2、 函数模版可以重载:可以定义有相同名字但形参数目或类型不同的多个函数模版,也可以定义与函数模版有相同名字的普通非模版函数。