首页 > 代码库 > 模板系列(一) 模板的模板参数
模板系列(一) 模板的模板参数
前面我们写过类似的Stack:
template <typename T, typename Alloc = std::vector<T> >class Stack{public: void push(const T &); void pop(); T top() const; bool empty() const;private: Alloc _cont;};
那么我们使用的时候需要这样:
Stack<string, list<string> > st;
我们看到,string这个类型参数出现了两次,那么可不可以消除呢?
显然我们的目的是只指定容器的类型,而不包括元素的类型,这就需要借助模板的模板参数,来帮助我们写出一下代码:
Stack<string, list> st;
这里我们需要定义模板参数的第二项为模板:
template <typename T, template <typename ELEM> class Alloc = std::vector>class Stack;
我们写出一份完整的实现:
1 template <typename T, 2 template <typename ELEM> 3 class Alloc = std::vector> 4 class Stack 5 { 6 public: 7 void push(const T &s); 8 void pop(); 9 T top() const10 { return _cont.back(); }11 12 bool empty() const13 { return _cont.empty(); }14 private:15 Alloc<T> _cont;16 };17 18 template <typename T, template <typename> class Alloc>19 void Stack<T, Alloc>::push(const T &s)20 {21 _cont.push_back(s);22 }23 24 template <typename T, template <typename> class Alloc>25 void Stack<T, Alloc>::pop()26 {27 _cont.pop_back();28 }
然而该段代码仍然会编译错误,这是因为无论是vector还是list都有两个模板参数,于是无法与Alloc这个参数匹配。
我们将模板修改为:
template <typename T, template <typename ELEM, typename Alloc = std::allocator<ELEM> > class Container = std::vector>class Stack;
完整的实现为:
1 template <typename T, 2 template <typename ELEM, typename Alloc = std::allocator<ELEM> > 3 class Container = std::vector> 4 class Stack 5 { 6 public: 7 void push(const T &s); 8 void pop(); 9 T top() const10 { return _cont.back(); }11 12 bool empty() const13 { return _cont.empty(); }14 private:15 Container<T> _cont;16 };17 18 template <typename T, template <typename, typename> class Container>19 void Stack<T, Alloc>::push(const T &s)20 {21 _cont.push_back(s);22 }23 24 template <typename T, template <typename, typename> class Container>25 void Stack<T, Alloc>::pop()26 {27 _cont.pop_back();28 }
测试代码为:
Stack<string, list> st;st.push("foo");st.pop();
模板系列(一) 模板的模板参数
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。