类模板Stack例子
///Stack<T>声明、定义
template <typename T>
class Stack
{
private:
vector<T> elems;
public:
void push(T const &);
void pop();
T top() const;
};
template <typename T>
void Stack<T>::push(T const &elem)
{
...
}
template <typename T>
void Stack<T>::pop()
{
...
}
template <typenane T>
void Stack<T>::top() const
{
...
}
///Stack<T>使用``
Stack<int> intStack;
intStack.push(7);
成员函数在使用时才会被实例化。对于上面模板类Stack,只有push函数具有实体,因为push函数已经被调用。这种特性带来的一个好处是,即使int不支持Stack模板中成员函数pop和top中的操作,也可以使用Stack模板。
但是对于类模板中的静态成员函数,所有用来实例化的类型,都会实例化静态成员函数,而不会等到调用时才实例化。
类模板特化
用string特化Stack<T>的例子//
class Stack<string>
{
private:
deque<string> elems;
public:
void push(string const&);
void pop();
string top() const;
};
void Stack<string>::push(string const& elem)
{
...
}
void Stack<string>::pop()
{
...
}
string Stack<string>::top() const
{
...
}
特化类的实现和基本类模板的实现可以完全不同。Stack基本类模板是用vector管理内部元素的,而特化类Stack用deque。
局部特化
template <typename T1, typename T2>
class MyClass
{
...
};
// 第一种局部特化:模板参数具有相同类型
template <typename T>
class MyClass<T, T>
{
...
};
// 第二种局部特化:部分模板参数为具体类型
template <typename T>
class MyClass<T, int>
{
...
};
// 第三种局部特化:模板参数为指针类型
template <typename T1, typename T2>
class MyClass<T1*, T2*>
{
...
};
编译器会选择匹配程度最好的模板,当多个模板同等匹配时就是声明具有二义性。
// 具有二义性的模板类对象声明 (同等匹配MyClass<T, T>和MyClass<T, int>)
MyClass<int, int> m;
缺省模板参数
类模板允许为模板参数定义缺省值,被称为缺省模板实参。缺省模板实参还可以引用前面的模板参数。
template <typename T, typename CONT = vector<T>>
class Stack
{
private:
CONT elemes;
};