前面我们写过类似的Stack:
template>class Stack{public: void push(const T &); void pop(); T top() const; bool empty() const;private: Alloc _cont;};
那么我们使用的时候需要这样:
Stack> st;
我们看到,string这个类型参数出现了两次,那么可不可以消除呢?
显然我们的目的是只指定容器的类型,而不包括元素的类型,这就需要借助模板的模板参数,来帮助我们写出一下代码:
Stackst;
这里我们需要定义模板参数的第二项为模板:
templateclass Alloc = std::vector>class Stack;
我们写出一份完整的实现:
1 template3 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 _cont;16 };17 18 template class Alloc>19 void Stack ::push(const T &s)20 {21 _cont.push_back(s);22 }23 24 template class Alloc>25 void Stack ::pop()26 {27 _cont.pop_back();28 }
然而该段代码仍然会编译错误,这是因为无论是vector还是list都有两个模板参数,于是无法与Alloc这个参数匹配。
我们将模板修改为:template> class Container = std::vector>class Stack;
1 template> 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 _cont;16 };17 18 template class Container>19 void Stack ::push(const T &s)20 {21 _cont.push_back(s);22 }23 24 template class Container>25 void Stack ::pop()26 {27 _cont.pop_back();28 }
Stackst;st.push("foo");st.pop();