与函数相似,类也可以被一种或多种类型参数化。容器类就是一个具有这种特性的典型例子,它通常被用于管理某种特定类型的元素。只要使用类模板,你就可以实现容器类,而不需要确定容器中元素的类型。
1.类模板的定义
template <typename T>
class Stack{
....
};
2.类模板的使用示例
//stack1.h
#ifndef STACK1_H
#define STACK1_H
#include <vector>
#include <stdexcept>
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 &elem)
{
elems.push_back(elem); //把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(); //返回最后一个元素的拷贝
}
#endif // STACK1_H
//stack1test.cpp
#include <iostream>
#include <string>
#include <cstdlib>
#include "stack1.h"
int main()
{
try {
Stack<int> intStack; //无素类型为int的栈
Stack<std::string> stringStack; //元素类型为字符串的栈
//操作int栈
intStack.push(7);
std::cout << intStack.top() << std::endl;
//操作string栈
stringStack.push("hello");
std::cout << stringStack.top() << std::endl;
stringStack.pop();
stringStack.pop();
} catch (std::exception const &ex) {
std::cerr << "Exception: " << ex.what() << " line==" << __LINE__ << std::endl;
return EXIT_FAILURE; //程序退出,且带有ERROR标记
}
std::cout << "Hello World!" << std::endl;
return 0;
}
运行结果:
类模板的函数实现要加template <typename T>
template <typename T>
void Stack<T>::push(T const &elem)
{
elems.push_back(elem); //把elem的拷贝附加到末尾
}