模板系列(一) 模板的模板参数

前面我们写过类似的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() const
10     { return _cont.back(); }
11
12     bool empty() const
13     { 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() const
10     { return _cont.back(); }
11
12     bool empty() const
13     { 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();
时间: 2024-12-19 12:19:31

模板系列(一) 模板的模板参数的相关文章

模板系列(一)模板的模板参数

在之前,我们写过类似的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>

【Ecmall】ECMall2.x模板制作入门系列(认识ECMall模板)

ECMall2.x模板制作入门系列之1(认识ECMall模板) 从ECMall2.0全新架构发布以来,随着版本的不断更新,ECMall已经逐渐走向一个稳定时期,是时候整理一些实用教程了.下面给大家带来一个模板制作入门教程. 申明:本人第一次写教程.可能只能说一些比较浅显的基础知识.条理性可能不是很到位,说得不对的地方欢迎拍砖并指正,目的是希望通过这次教程能让新手们对模板有一个比较系统的认识. 一.ECMall的模板文件在网站中怎么分布的.怎么找到一个页面所对应的模板theme/ 主题目录 商城模

JS组件系列——基于Bootstrap Ace模板的菜单Tab页效果优化

前言:之前发表过一篇  JS组件系列——基于Bootstrap Ace模板的菜单和Tab页效果分享(你值得拥有) ,收到很多园友的反馈,当然也包括很多诟病,因为上篇只是将功能实现了,很多细节都没有处理,这篇博主将带领大家一起来优化这里的效果,使之成为一个可以在项目里面使用的成品. 说点题外话,本来,在互联网模式下,Tab页+iframe的组合是不能被大多数平台接受的,从这些年推出的一些好的产品可以看出,几乎大家都不这么玩,即使是一些后台的管理模板,比如常见的AdminLTE.Ace.INSPIN

FormView的插入模板中的DropDownList控件参数

<%@ Page Language="VB" AutoEventWireup="false" CodeFile="Default.aspx.vb" Inherits="_Default" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DT

SharePoint 2013 图文开发系列之定义站点模板

原文:SharePoint 2013 图文开发系列之定义站点模板 SharePoint站点模板是一个非常好的功能,方便我们开发一类网站,然后在此基础上做二次开发,对于SharePoint的使用,有着举足轻重的作用. 因为篇幅比较长,所以加上目录,方便大家查看: 一.为站点模板添加母版页 二.为站点模板添加自定义列表 三.为站点模板添加可视化WebPart 1.添加新项目,选择SharePoint 2013 空项目,如下图: 2.选择调试站点,部署为场解决方案,如下图: 3.添加新项,选择网站定义

vSphere部署系列之10——虚拟机模板和规范

在前面的博文章节中,已搭建了群集,并启用了HA和DRS,但还没有划分资源池,这种情况已经可以应付实际生产环境.资源池的创建和配置比较简单.难点在对配额的理解和按需划分.有兴趣的朋友可以网上查阅相关资料,这里暂不作研究. vCenter提供了模板功能,可把一台已部署好的虚拟机转换为模板,然后以此模板为镜像批量部署虚拟机.这一节是关于虚拟机模板及其管理规范方面的操作. 实验环境总体规划,请见前面的博文<vSphere部署系列之03--实验环境总体规划> ▲总体规划网络拓扑图 一.前期工作 在使用模

动软模板系列一

先看下动软官方的教程: http://www.maticsoft.com/help/Template.htm#_Toc292191122 六.    模板编写教程 模板的大体分为5块内容:模板指令声明,代码语句块,表达式块,类功能控制块,文本块输出.下面我们分别来介绍一下这5块内容的语法和使用说明. 模板指令声明块 <#@  #> 和ASP.NET页面的指令一样,它们出现在文件头,通过<#@…#>表示.其中<#@ template …#>指令是必须的,用于定义模板的基本

动软模板系列二(Model层模板)

动软模板其实和CodeSmith的模板差不多 实现的原理是一样的,但是CodeSmith貌似只支持表生成,而且不够“国人化”,所以打算研究下动软的模板,如果熟练掌握后想必以后开发项目效率可以提高很多了: 这里以典型三层的默认模板为例子: -----------------------------------------------------------------------------------------------------------------------------------

类模板,多种类型的类模板,自定义类模板,类模板的默认类型,数组的模板实现,友元和类模板,友元函数,类模板与静态变量,类模板与普通类之间互相继承,类模板作为模板参数,类嵌套,类模板嵌套,类包装器

 1.第一个最简单的类模板案例 #include "mainwindow.h" #include <QApplication> #include <QPushButton> #include <QLabel> template<class T> class run { public: T w; void show() { w.show(); } void settext() { w.setText("A"); }

求变量的数据类型,typeid,bool,C和C++的不同,new和delete,C++中的枚举,inline和可变参数模板,auto和函数模板,宽字符

求变量的数据类型,通过函数typeid(变量名).name();获得变量的数据类型. 案例如下: #include <iostream> #include <stdlib.h> void main() { double db = 10.9; double *pdb = &db; auto num = pdb; //通过typeid的方式获得数据类型 std::cout << typeid(db).name() << std::endl; std::c