天天看點

類模闆的模闆參數

  • 類模闆的模闆參數
    1.函數模闆是不支援模闆參數的,而類模闆支援模闆參數。
          2.差別:
                  不使用模闆參數:     Stack<int, std::vector<int> > vStack;
                  使用模闆參數:    Stack<int, std::vector> vStack;
              std::vector本身實模闆,而std::vector<int則是作為class存在。
          3.注意模闆參數需要比對.
              template<class T> class TT = std::deque            //錯誤,模闆參數不比對
              template<class T, class Alloc = std:alloctor<T> > class TT = std::deque //OK.
               

MyStack.h

#ifndef MYSTACK_H__
#define MYSTACK_H__

#include<deque>
#include<stdexcept>
#include<memory>

namespace gdl {

	template<class T,
			template<typename ELEMT,
					typename Alloc = std::allocator<ELEMT> >
					class CONT = std::deque>
	class MyStack {
	public:
		void push(T const &);
		void pop();
		T top() const;
		bool empty() const {
			return elements.empty();
		}
		template<class T2,
				template<typename ELEMT2,
						typename Alloc2=std::allocator<ELEMT2> >
						class CONT2>
		MyStack<T, CONT> &operator=(MyStack<T2, CONT2> const&);
	private:
		CONT<T> elements;
	};

	template<class T, template<typename, typename>class CONT>
	void MyStack<T,CONT>::push(T const&val) {
		elements.push_back(val);
	}

	template<typename T, template<typename,typename>class CONT>
	void MyStack<T, CONT>::pop() {
		if (elements.empty()) {
			throw std::out_of_range("MyStack<>::pop(): empty stack.");
		}
		elements.pop_back();
	}

	template<class T, template<class,class>class CONT>
	T MyStack<T, CONT>::top() const {
		if (elements.empty()) {
			throw std::out_of_range("MyStack<>::top(): empty stack.");
		}
		return elements.back();		//傳回末端元素.
	}

	template<typename T, template<typename,typename>class CONT>
	template<typename T2, template<typename,typename>class CONT2>
	MyStack<T, CONT>& MyStack<T, CONT>::operator= (MyStack<T2, CONT2> const & op2) {
		//指派自身.
		if ((void*)this == (void*)&op2) {
			return *this;
		}

		//copy.
		MyStack<T2, CONT2> tmp(op2);
		//clear.
		elements.clear();
		while (!tmp.empty()) {
			elements.push_back(tmp.top());
			tmp.pop();
		}
		return *this;
	}
}


#endif
           

main.cpp

#include<iostream>
#include"MyStack.h"
#include<cstdlib>
#include<string>
#include<vector>


#include"test.h"
using namespace std;



int main(int argc, char** argv)
{

	//=============================================
	try {
		gdl::MyStack<int> intStack;
		gdl::MyStack<float> floatStack;

		//使用int棧.
		intStack.push(20);
		intStack.push(50);
		intStack.push(500);

		//使用float stack.
		floatStack.push(50);
		floatStack.push(200);

		//不同類型的stack的互相指派.
		floatStack.operator=(intStack);
		//gdl::MyStack<float> floatStack2 = intStack;

		while (!floatStack.empty()) {
			std::cout << floatStack.top() << std::endl;;
			floatStack.pop();
		}
		floatStack.top();
	}
	catch (std::exception const & e) {
		std::cout << e.what() << std::endl;
	}
	
	return 0;
}
           

print:

類模闆的模闆參數

繼續閱讀