类模板的模板参数

    xiaoxiao2022-07-07  201

    类模板的模板参数

    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:

    最新回复(0)