C++ Template類模板

與函數相似,類也可以被一種或多種類型參數化。容器類就是一個具有這種特性的典型例子,它通常被用於管理某種特定類型的元素。只要使用類模板,你就可以實現容器類,而不需要確定容器中元素的類型。

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的拷貝添加到末尾
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章