首页 > 编程语言 >模板元编程之非类型模板参数

模板元编程之非类型模板参数

时间:2023-06-28 22:33:12浏览次数:25  
标签:编程 Stack numElems 参数 template stack 之非 模板

一、简介

对于函数模板和类模板,模板参数并不局限于类型,普通值也可以作为模板参数,当要使用基于值的模板时,必须显示的指定这些值,才能够对模板进行实例化,并获得最终代码。

template <typename T, int MAXSIZE>
class Stack {
private:
    T elems[MAXSIZE]; //包含元素的数组
    int numElems;

public:
    Stack();
    void push(T const&);
    void pop();
    T top() const;
    bool empty() const {
        return numElems == 0; //返回栈是否为空
    }
    bool full() const {
        return numElems == MAXSIZE; //返回栈是否已满
    }
};

template <typename T, int MAXSIZE>
Stack<T, MAXSIZE>::Stack():numElems(0) {

}

template<typename T, int MAXSIZE>
void Stack<T, MAXSIZE>::push(T const& elem) {
    if (numElems == MAXSIZE) {
        throw std::out_of_range("Stack<>::push():stack is full");
    }

    elems[numElems] = elem;
    ++numElems;
}

template<typename T, int MAXSIZE>
void Stack<T, MAXSIZE>::pop() {
    if (numElems <= 0) {
        throw std::out_of_range("Stack<>::pop():empty stack");
    }

    --numElems;
}

template<typename T, int MAXSIZE>
T Stack<T, MAXSIZE>::top() const {
    if (numElems <= 0) {
        throw std::out_of_range("Stack<>::top():empty stack");
    }

    return elems[numElems - 1]; //返回最后一个元素
}

从上述示例中我们可以使用元素数目固定的数组来实现stack,这个方法(固定大小的数组)的优点是:无论是开发者来管理内存,还是由变猪容器来管理内存,都可以避免内存管理开销。

二、非类型的类模板参数的使用

int main() {
    Stack<int, 20> int_stack; //可以存储20个int元素的栈
    int_stack.push(10);
    std::cout << int_stack.top() << std::endl;
    
    Stack<std::string, 40> string_stack; //可以存储40个int元素的栈
    string_stack.push("hello");
    std::cout << string_stack.top() << std::endl;

    return 0;
}

三、非类型的函数模板参数的使用

我们也可以为函数模板定义非类型参数,例如下面的函数模板定义了一组用于增加特定值的函数

template<typename T, int VAL>
T addValue(T const& x) {
    return x + VAL;
}

四、非类型模板参数的限制

非类型模板参数是有限制的,通常而言,它们可以是常整数(包括枚举值),或者指向外部链接对象的指针。但是浮点数和类对象是不允许作为非类型模板参数的

template <double VAT>
double process(double v) {
    return v * VAT;
}

template <std::string name>
class MyClass {

};

总结:

(1).模板可以具有值模板参数,而不仅仅是类型模板参数

(2).对于非类型模板camshaft,不能使用浮点数、class类型的对象和内部链接对象(如string)作为实参

标签:编程,Stack,numElems,参数,template,stack,之非,模板
From: https://www.cnblogs.com/TechNomad/p/17512730.html

相关文章

  • Spark编程基础
    Scala编写Spark的WorkCount创建一个Maven项目在pom.xml中添加依赖和插件<!--定义的一些常量--><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target><encoding>UTF-8</e......
  • 模板
       ......
  • 十九、面向对象编程
    十九、面向对象编程类与对象类是总结事物特征的抽象概念,是创建对象的模板。对象是按照类来具体化的实物。类的构成类的名称:类名类的属性:一组参数数据类的方法:操作的方式或行为类的创建#classPeople(object):新式类classPeople():经典类classPeople(object):#类......
  • 面向对象程序编程6-8次PTA题目集(成绩计算系列)的总结性Blog
    1.对之前发布的6-8次PTA题目集(成绩计算系列),内容要求如下:(1)前言:总结之前所涉及到的知识点、题量、难度等情况第六次PTA题目集:知识点:此次PTA题目仅只有这一个题目,主要考的内容就是对类的使用(类似现实,对有关联的各个数据合并在一起,便于一起使用),运用正则表达式(比较苦难使用,要记住那......
  • Premiere Pro模板导入教程 如何导入.mogrt文件?
    在使用AdobePremierePro编辑视频时,你可以使用现成的模板来快速制作和修改视频效果。其中一种常用的模板是.mogrt文件,它是PremierePro自带的模板格式。如果你想要使用这些模板,就需要将它们导入到PremierePro中。mogrt文件如何打开?这里小编为大家带来了pr模板导入教程,一起来看......
  • (Python编程)集成代码生成器SWIG
    ProgrammingPython,3rdEdition翻译最新版本见:http://wiki.woodpecker.org.cn/moin/PP3eD22.6.TheSWIGIntegrationCodeGenerator22.6.集成代码生成器SWIGButdon'tdothat.Asyoucanprobablytell,manualcodingofCextensionscan......
  • (Python编程)Jython:Java的Python
    ProgrammingPython,3rdEdition翻译最新版本见wiki:http://wiki.woodpecker.org.cn/moin/PP3eD欢迎参与翻译与修订。18.4.Jython:PythonforJava18.4.Jython:Java的PythonJython(formerlyknownasJPython)isanentirelydistinctimpleme......
  • Kubernetes编程——client-go基础—— TypeMeta
    TypeMetahttps://github.com/kubernetes/apimachinery/blob/release-1.27/pkg/runtime/types.go runtime.Object只是一个接口,我们想了解它具体时间怎么实现的。k8s.io/api中的Kubernetes对象通过内嵌k8s.io/apimachinery/meta/v1中的metav1.TypeMeta结构,为schema.Obj......
  • Linux使用HTTP隧道代理模板
    以下是一个使用HTTP隧道代理的Linux模板:1.首先,确保你已经安装了curl和socat工具。如果没有安装,可以使用以下命令进行安装:```sudoapt-getinstallcurlsocat```2.创建一个名为proxy.sh的脚本文件,并将以下内容复制到文件中:```bash#!/bin/bash#设置代理服务器的地址和端口PROXY_H......
  • 【雕爷学编程】Arduino动手做(134)---PCF8574T扩展模块
    7款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手尝试系列实验,不管成功(程序走通)与否,都会记录下来—小小的进步或是搞......