类也可以被一种或多种类型参数化。容器类就是一个具有这种特性的典型例子,通常被用于管理某种特定类型的元素。
只要使用类模板,你就可以实现容器类,而不需要确定容器中元素的类型。
#include <vector>
template <typename T>
class Stack{
private:
std::vector<T> elems; //存储元素的容器
public:
void push{ T const&}; //压人元素
void pop(); //弹出元素
T top() const; //返回栈顶元素
bool empty() const{ //返回栈是否为空
return elems.empty();
}
};
template <typename T>
void Stack<T> :: push(T const& e_em)
{
elem.push_back(e_em); //把elem的拷贝附加到末尾
}
template<typename T>
void Stack<T>::pop()
{
if(elems.empty()){
throw std::out_of_range(stack<>::pop():empty stack");
}
elems.pop_back(); //删除最后一个元素
}
template<typename T>
T stack<T>::top() const
{
if(elems.empty()){
throw std::out_of_range("Stack<>:: top() : empty stack");
}
return elems.back();
}
在声明中需要使用该类的类型时,必须使用Stack<T>,如果需要声明自己实现的拷贝构造函数和赋值运算符,
template <typename T>
class Stack{
Stack(Stack<T> const& ); //拷贝构造函数
Stack<T>& operator = (Stack<T> const&); //赋值运算符
}
然而,当使用类名而不是类的类型时,就应该只用Stack; 譬如,当你指定类的名称、类的构造函数、析构函数时,就应该使用Stack.