1.1 template 模版
所谓templates, 是针对一个或多个尚不明确类型所撰写的函数或者类别。使用template时可以显示或者隐士的将型别当作参数来传递。如传回两数之中的较大数:
template <class T>在这里第一行将T定义为任意数据类别, 在函数调用时由调用者指定, 任何合法的识别符都可以拿来作为参数名称, 但通常用T标识, 这个型别由关键字class引导, 但型别本身不一定是class。
inline const T& max(const T& a, const T& b)
{
return a < b ? b:a;
}
Default template
template classes 可以又缺省参数, 如一下声明,允许使用一个或者两个template参数来声明Myclass对象:
template<class T, class container = vector<T>>
class MyClass;
如果只传递给他一个参数, 那么缺省参数可作为第二个参数使用,
MyClass<int> X1;
MyClass<int, vector<int>>
缺省参数可根据前一个参数而定义。
1.2关键字Typename
关键字typename被用来作为类型之前的标识符号,如:
template <class T>
class MyClass
{
typename T::SubType * ptr;
....
};
这里typename指出subtype是class T中定义的一个类别, 英雌ptr是一个指向T::subtype类别的指针, 如果没有关键字typename,subtype会被当成 一个静态static成员,于是:
T::subtype * ptr 会被解释为类别T内的数值subtype和ptr的乘积。
Subtype成为一个型别的条件是,任何一个用来取代T的型别, 其内都必须提供一个内部类型subtype的定义, 如:
MyClass<Q> x;
必要的条件是型别Q有如下的内部型别定义:
class Q
{
typedef int Subtype;
。。。
};