模板的模板参数使用示例

注意:函数模板不支持模板的模板参数。

Stack7.h中定义的Stack:

#ifndef STACK7_H
#define STACK7_H

#include <deque>
#include <stdexcept>
#include <memory>

template <typename T,
        template <typename ELEM, typename = std::allocator<ELEM> >
        class CONT = std::deque>
class Stack
{
public:
    void push(T const&);
    void pop();
    T top() const;
    bool empty() const
    {
        return elems.empty();
    }

    template<typename T2,
            template<typename ELEM2, typename = std::allocator<ELEM2> >
            class CONT2>
    Stack<T, CONT>& operator = (Stack<T2, CONT2> const&);
private:
    CONT<T> elems;
};

template <typename T, template <typename, typename> class CONT>
void Stack<T, CONT>::push(T const& elem)
{
    elems.push_back(elem);
}

template <typename T, template <typename, typename> class CONT>
void Stack<T, CONT>::pop()
{
    if (elems.empty())
        throw std::out_of_range("Stack<>::pop(): empty stack");

    elems.pop_back();
}

template <typename T, template <typename, typename> class CONT>
T Stack<T, CONT>::top() const
{
    if (elems.empty())
        throw std::out_of_range("Stack<>::top(): empty stack");

    return elems.back();
}

template <typename T, template <typename, typename> class CONT>
template <typename T2, template <typename, typename> class CONT2>
Stack<T, CONT>& Stack<T, CONT>::operator = (Stack<T2, CONT2> const& op2)
{
    if ((void*)this == (void*)&op2)
        return *this;

    Stack<T2, CONT2> tmp(op2);
    elems.clear();
    while (!tmp.empty())
    {
        elems.push_front(tmp.top());
        tmp.pop();
    }

    return *this;
}

#endif // STACK7_H

测试代码main.cpp:

#include <iostream>
#include <string>
#include <cstdlib>
#include <vector>
#include "Stack7.h"

using namespace std;

int main()
{
    try
    {
        Stack<int, std::vector> vecStack;
        vecStack.push(2);
        vecStack.push(3);
        std::cout << "vector Stack‘s top: " << vecStack.top() << std::endl;
        vecStack.pop();

        Stack<int> intStack;
        Stack<float> floatStack;

        intStack.push(6);
        intStack.push(7);

        floatStack.push(9.9);

        floatStack = intStack;

        std::cout << floatStack.top() << std::endl;
        floatStack.pop();
        std::cout << "float Stack‘s top:" << floatStack.top() << std::endl;
        floatStack.pop();
        std::cout << "float Stack‘s top:" << floatStack.top() << std::endl;
        floatStack.pop();
    }
    catch (std::exception const& ex)
    {
        std::cerr << "Exception: " << ex.what() <<std::endl;
    }

    return 0;
}

结果:

时间: 2024-08-13 02:02:28

模板的模板参数使用示例的相关文章

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

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

Django入门示例之被解放的姜戈——03 所谓伊人(模板及模板处理)

在之前的程序中,我们直接生成一个字符串,作为http回复,返回给客户端.这一过程中使用了django.http.HttpResponse(). 在这样的一种回复生成过程中,我们实际上将数据和视图的格式混合了到上面的字符串中.看似方便,却为我们的管理带来困难.想像一个成熟的网站,其显示格式会有许多重复的地方.如果可以把数据和视图格式分离,就可以重复使用同一视图格式了. Django中自带的模板系统,可以将视图格式分离出来,作为模板使用.这样,不但视图可以容易修改,程序也会显得美观大方. 1.模板初

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

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

[C++] 利用模板的模板参数实现单链表

模板的模板顾名思义就是一个模板函数的参数是另一个模板函数的模板. 模板函数有兴趣的读者请看我上一篇博客模板函数,实现顺序表, 请看模板的模板简要举例 上边两张图片就是模板的模板类型了,模板的模板也可以使用缺省参数(这一点与函数相似) 好了上面介绍过了,现在直接上代码吧,我个人觉得一个函数怎么用,还是直接看实例更容易让人懂, 下面是单链表的节点类, 用的是模板函数 #pragma once #include<iostream> using namespace std; #include<s

一个超级简单的HTML模板框架源代码以及使用示例

HTML模板框架源代码 var HtmlTemplate = (function () { function HtmlTemplate(htmlSource) { this.htmlSource = htmlSource; } HtmlTemplate.prototype.toHTML = function (params) { var reg = HtmlTemplate.REG_FILTER_PARAM; var m = this.htmlSource.replace(reg, functi

STL源码分析--仿函数 &amp; 模板的模板参数 &amp; 临时对象

STL源码分析-使用的一些特殊语法 关于泛型编程中用到的一些特殊语法,这些语法也适用于平常的模板编程 1.  类模板中使用静态成员变量 Static成员变量在类模板中并不是很特殊,同时这个变量不属于对象,属于实例化以后的这个类类型.每一个实例化对应一个static变量 2.  类模板中可以再有模板成员 3.  模板参数可以根据前一个模板参数而设定默认值 4.  类模板可以拥有非类型的模板参数 所谓非类型的模板参数就是内建型的模板参数 Template <class T,class Alloc =

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

 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"); }

Django——模板路径 模板变量 常用过滤器 静态文件的使用

Django 模板路径 模板变量 过滤器 静态文件的加载 模板的路径,有两种方法来使用 设置一个总的templates在大项目外面,然后在sittings的TEMPLATES中声明 在每一个APP中创建templates,然后在settings的INSTALLED_APPS中声明 模板变量的使用 语法:   {{ 变量名 }} 命名由字母和数字以及下划线组成,不能有空格和标点符号 可以使用字典.模型.方法.函数.列表 不要和python或django关键字重名 变量和查找 注:1.如果data是

Struts2中使用Velocity模板时模板资源路径配置问题

在Struts2中使用Velocity模板时,如何以相对与Web工程的路径来配置模板资源文件路径这个问题网上千篇一律的来自Velocity官方文档.官方文档中指出如果是Web工程的话,模板的相对路径是工程根路径,今天在使用的时候有如下配置: Velocity.properties(默认在WEB-INF下): resource.loader =file, classclass.resource.loader.description = Velocity Classpath Resource Loa