與函數相似,類也可以被一種或多種類型參數化。容器類就是一個具有這種特性的典型例子,它通常被用於管理某種特定類型的元素。只要使用類模板,你就可以實現容器類,而不需要確定容器中元素的類型。
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 &elem); //壓入元素
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 "stack1.h"
#include <iostream>
#include <string>
#include <cstdlib>
int main()
{
try {
Stack<int> intStack; //元素類型爲int的棧
Stack<std::string> stringStack; //元素類型爲字符串的棧
//使用int棧
intStack.push(7);
std::cout << "intStack.top()==========" << intStack.top() << std::endl;
//使用string棧
stringStack.push("camel");
std::cout << "stringStcak.top()=======" << stringStack.top() << std::endl;
stringStack.pop();
stringStack.pop();
}
catch (std::exception const& ex) {
std::cerr << "Exception:" << ex.what() << std::endl;
return EXIT_FAILURE; //程序退出,且帶有ERROR標記
}
return 0;
}
運行結果:
模板類的成員函數實現與普通類的成員函數實現還有點不一樣
必須在實現時加上template <typename T>, 例如:
template <typename T>
void Stack<T>::push(T const &elem)
{
elems.push_back(elem); //把elem的拷貝添加到末尾
}