首页 > 编程语言 >模板元编程之类模板(一)

模板元编程之类模板(一)

时间:2023-06-18 12:22:41浏览次数:48  
标签:const void 编程 elems template 之类 Stack 模板

一、类模板Stack的实现

#include <iostream>
#include <vector>

template <typename T>
class Stack {
private:
    std::vector<T> elems; //存储元素的容器

public:
    void push(T const&); //压入元素
    void pop(); //弹出元素
    T top() const; //返回栈顶元素
    bool empty() const {
        return elems.empty();
    }
};

template <typename T>
void Stack<T>::push(T const& elem) {
    elems.push_back(elem); //把elems的拷贝附加到末尾
}

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

    elems.pop_back();
}

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

    return elems.back(); //返回最后一个元素的拷贝
}

二、类模板的声明

类模板的声明和函数模板的声明很类似

template <typename T> 
class Stack {
    ...
};

另外,可以再次使用关键字class来代替typename:

template <class T>
class Stack {
    ...
};

在类模板的内部,T可以像其他任何类型一样,用于声明成员变量和成员函数,在下面的示例中,T被用于声明vector的元素类型,声明push()是一个接收常量T引用为唯一实参的成员函数,声明top是返回类型为T的成员函数:

template <typename T>
class Stack {
private:
    std::vector<T> elems; //存储元素的容器

public:
    void push(T const&); //压入元素
    void pop(); //弹出元素
    T top() const; //返回栈顶元素
};

这个类的类型是Stack<T>,其中T是类模板参数,因为,在声明中需要使用该类的类型时,必须使用Stack<T>。例如,如果你要声明自己实现的拷贝构造函数和赋值运算符,那应该如下述示例:

template <typename T>
class Stack {
    ...
    Stack(Stack<T> const&); //拷贝构造函数
    Stack<T>& operator=(Stack<T> const&); //赋值运算符
};

但是,但使用类名而不是类的类型时,就应该只用Stack,比如,当指定类的名称,类的构造函数,析构函数时,就应该使用Stack。

标签:const,void,编程,elems,template,之类,Stack,模板
From: https://www.cnblogs.com/TechNomad/p/17488960.html

相关文章

  • 【C】专家编程 (Expert C Programming) 阅读笔记
      第一章C:穿越时空的迷雾  1p22~24 ANSIC有此问题。“安静”的类型转换原则:当执行算术运算时,操作数的类型如果不同,就会发生转换。数据类型一般朝着浮点精度更高,长度更长的方向转换,整形术如果转换为singed不会丢失信息,就转换为signed,否则转换为unsign......
  • 关于如何使用C++进行编程(不使用数据库的情况下)
    问题描述对于一个长期使用Java连接数据库,实现javaweb编程的软工友友来说,突然在编程任务中不允许连接数据库,就有一点的蒙圈,没有办法,只能去查阅资料啦!问题解决不出意外的话,这次我们就需要使用文件操作来存储数据啦!(然后另外一种方法时json,显然,文件操作更加简单一点、也是更加熟悉......
  • 【雕爷学编程】Arduino动手做(114)---US-015高分辨超声波模块
    37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手尝试系列实验,不管成功(程序走通)与否,都会记录下来---小小的进步或是......
  • C语言基础教程(宏的使用和多文件编程)
    (文章目录)前言这篇文章来给大家讲解一下C语言中的多文件编程,在C语言开发项目的过程中使用多文件编程是必不可少的,使用多文件编程可以方便我们代码的管理和编写,让我们的代码可读性和移植性更高。一、宏的定义和使用在C语言中,宏(Macro)是一种预处理指令,用于在编译阶段进行文本......
  • Makefile编写模板 & 学习笔记
    一、模板#伪命令.PHONY:cleancompileSocompileExerun:compileExe@./maincompileExe:compileSo@g++main.cpp-Llib-lsoowCapture-lcamapi-lpthread=lImageProc-ljpeg-lhv_static-omaincompileSo:@g++fPIC-sharedsoowCapture.cpp-Iinclu......
  • Weekly Report Template Duplicator - 周报模板复制器
    下面是周报模板复制/生成器代码:##WeeklyReportGenerator####ByAlexanderEzharjan#####Configs###template_file='template.docx'week_start=(2023,6,19)week_end=(2023,6,25)fin_date_tag="number:YOUR_STAFF_ID)"#落款时间标记########......
  • java web模板学习
    经过建民老师几次测验我发现我是真写不完那个web系统项目,然后如果真的打分的话,不会很高。所以接下来时间我要学习一些javaweb模板。这个模板吧主要是基于springboot的系统模板。我学习一下,等下次测验就可以快点。......
  • 编程知识提纯之法
    编程知识提纯,本质上就是将编程知识结构化。引言在“打造适合自己的知识库”一文中,讲到了打造知识库的一般步骤。其中整理固然是必要工作,而核心却在于知识提纯。在“职业发展战术设计:构建可持续积累的职业优势”一文中,谈到:构建良好职业优势的一大基础支撑能力即是知识提纯能......
  • Reactive Extensions 响应式扩展 用于事件驱动编程的库,具有可组合的声明性模型
    响应式扩展这个存储库包含四个库,它们在概念上是相关的,因为它们都与LINQoverofthings序列有关:ReactiveExtensionsfor.NET又名Rx.NET或Rx( System.Reactive ):一个用于事件驱动编程的库,具有可组合的声明性模型AsyncRx.NET(实验性预览)(System.Reactive.Async):Rx的实验......
  • opencv 模板匹配
    -逐个比较像素点之间差异importcv2importnumpyasnpimg=cv2.imread('C:/Users/59925/Desktop/pytest/pics/minions-s.jpg',0)#把图片读取成灰度图template=cv2.imread('C:/Users/59925/Desktop/pytest/pics/eye.jpg',0)#把图片读取成灰度图method='cv2.TM_SQDIFF_NORMED&......