博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
模板系列(一) 模板的模板参数
阅读量:6672 次
发布时间:2019-06-25

本文共 1861 字,大约阅读时间需要 6 分钟。

前面我们写过类似的Stack:

template 
>class Stack{public: void push(const T &); void pop(); T top() const; bool empty() const;private: Alloc _cont;};

那么我们使用的时候需要这样:

Stack
> st;

我们看到,string这个类型参数出现了两次,那么可不可以消除呢?

显然我们的目的是只指定容器的类型,而不包括元素的类型,这就需要借助模板的模板参数,来帮助我们写出一下代码:

Stack
st;

这里我们需要定义模板参数的第二项为模板:

template 
class Alloc = std::vector>class Stack;

我们写出一份完整的实现:

1 template 
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
_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 }

测试代码为:

Stack
st;st.push("foo");st.pop();

 

转载于:https://www.cnblogs.com/gjn135120/p/4008773.html

你可能感兴趣的文章
UIAlertView 总结
查看>>
邮件服务器:SMTP协议原始命令码和工作原理
查看>>
在Sublime Text中配置 JavaScript 控制台(JavaScript Console in Sublime Text)
查看>>
python使用os模块获取当前目录
查看>>
DNS服务(一)——DNS原理及其解析过程详解
查看>>
卸载linux软件总结
查看>>
redhat 6.5 安装和配置zabbix客户端
查看>>
硬链接和软链接(2)
查看>>
几种REST服务JAVA客户端类库
查看>>
什么是Hijax?Hijax的原理及优缺点介绍
查看>>
【2016-03-17】移动互联网时代,看好你的隐私
查看>>
linux命令:编译安装postfix邮件服务
查看>>
vi命令集
查看>>
oracle数据库克隆
查看>>
输出 pdf
查看>>
PHPCMS一个BUG
查看>>
APP云测试
查看>>
3-unit3 高速缓存DNS
查看>>
spark mllib 协同过滤算法,基于余弦相似度的用户相似度计算
查看>>
openwrt 基于qmi的 3G|4G拨号
查看>>