#include <iostream> #include <deque> #include <memory> template<typename T, template<typename ELEM, typename = std::allocator<ELEM> > class CONT = std::deque> class Stack{ private: std::deque<T> elems; public: void push(const T& elem); void pop(); T top() const; inline bool empty() const { return this->elems.empty(); } template<typename T2, template<typename ELEM2, typename = std::allocator<ELEM2> > class CONT2 = std::deque> Stack<T, CONT>& operator=(const Stack<T2, CONT2>& op2); }; template <typename T, template <typename, typename> class CONT> void Stack<T, CONT>::push(T const& elem) { elems.push_back(elem); } template <typename T, template <typename, typename> class CONT> void Stack<T, CONT>::pop() { if (elems.empty()) { throw std::out_of_range("Stack<>::pop() : empty stack"); } elems.pop_back(); } template <typename T, template <typename, typename> class CONT> T Stack<T, CONT>::top() const { if (elems.empty()) { throw std::out_of_range("Stack<>::top() : empty stack"); } return elems.back(); } template <typename T, template <typename, typename> class CONT> template <typename T2, template <typename, typename> class CONT2> Stack<T, CONT>& Stack<T, CONT>::operator=(const Stack<T2, CONT2>& op2) { if ((void*)this == (void*)&op2) { return *this; } Stack<T2, CONT2> tmp(op2); elems.clear(); while (!tmp.empty()) { elems.push_back(tmp.top()); tmp.pop(); } return *this; } int main(void) { //模板的模板参数 { try { Stack<int> intStack; Stack<float> floatStack; intStack.push(42); intStack.push(7); floatStack.push(7.7); floatStack = intStack; std::cout << floatStack.top() << std::endl; floatStack.pop(); std::cout << floatStack.top() << std::endl; } catch (std::exception const& ex) { std::cerr << ex.what() << std::endl; } } return 0; }
C++成员模板,模板的模板参数以及模板的默认参数
最新推荐文章于 2024-07-16 16:39:35 发布