c++ template笔记(3)非类型模板参数nontype template parameters
算是模板使用的一种技巧
用模板当数组元素参数维度
#include <stdexcept>template <typename T, int MAXSIZE> class Stack {private:T elems[MAXSIZE]; // elementsint numElems; // current number of elementspublic:Stack(); // constructorvoid push(T const&); // push elementvoid pop(); // pop elementT top() const; // return top elementbool empty() const { // return whether the stack is emptyreturn numElems == 0;}bool full() const { // return whether the stack is fullreturn numElems == MAXSIZE;} };// constructor template <typename T, int MAXSIZE> Stack<T,MAXSIZE>::Stack (): numElems(0) // start with no elements {// nothing else to do }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; // append element++numElems; // increment number of elements }template<typename T, int MAXSIZE> void Stack<T,MAXSIZE>::pop () {if (numElems <= 0) {throw std::out_of_range("Stack<>::pop(): empty stack");}--numElems; // decrement number of elements }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]; // return last element }
使用时就可以根据需要指定最大的元素个数,不用造成资源的浪费
#include <iostream> #include <string> #include <cstdlib> #include "stack4.hpp"int main() {try {Stack<int,20> int20Stack; // stack of up to 20 intsStack<int,40> int40Stack; // stack of up to 40 intsStack<std::string,40> stringStack; // stack of up to 40 strings// manipulate stack of up to 20 intsint20Stack.push(7);std::cout << int20Stack.top() << std::endl;int20Stack.pop();// manipulate stack of up to 40 stringsstringStack.push("hello");std::cout << stringStack.top() << std::endl; stringStack.pop();stringStack.pop();}catch (std::exception const& ex) {std::cerr << "Exception: " << ex.what() << std::endl;return EXIT_FAILURE; // exit program with ERROR status} }
注意:被实例化出来的int20Stack和int40Stack不可以隐式转换.
模板成员参数
template <typename T, int VAL> T addValue (T const& x) {return x + VAL; }
特化的参数,用于不在于类型,直接适用于函数中
注意点:浮点类型不可以作为nontype template parameters
以下定义是错误的
//error template <double T> double process(double v) {return v*T; }
c++ template笔记(3)非类型模板参数nontype template parameters相关推荐
- C++基础——非类型模板参数
非类型类模板参数 非类型函数模板参数 非类型模板参数的限制 非类型模板参看,顾名思义,模板参数不限定于类型,普通值也可作为模板参数.在基于类型的模板中,模板实例化时所依赖的是某一类型的模板参数,你定义 ...
- C++非类型模板参数
对于函数模板与类模板,模板参数并不局限于类型,普通值也可以作为模板参数.在基于类型参数的模板中,你定义了一些具体的细节来加以确定代码,直到代码被调用时这些细节才被真正的确定.但是在这里,我们面对的是这 ...
- C++知识点60——非类型模板参数
模板参数不仅可以使类型,也可以是值.可以用特定的类型名(比如int)而非typename或者class表示非类型模板参数.当模板被实例化时,非类型模板参数会被一个值而不是类型替代.非类型模板参数 一. ...
- java两个函数名字相同_为什么C不允许两个具有相同名称的函数/类模板,只有非类型模板参数(整数类型)的类型不同?...
我尝试这个时编译器会出错 . 我试过VC和g . 这同样适用于函数模板和类模板(但对于函数模板,只有在实例化函数模板时才会出现编译器错误;当编译器遇到第二个类定义时,会立即出现类模板的编译器错误) . ...
- C++17 非类型模板参数的auto 和 DevC++ 支持C++17
模板参数分为两种,一种是类型模板参数,也是我们用得最多的一种: template <typename T, typename U> auto add(T t, U u) { ret ...
- C++ 泛型编程(二):非类型模板参数,模板特化,模板的分离编译
目录 非类型模板参数 函数模板的特化 类模板的特化 全特化 偏特化 部分参数特化 参数修饰特化 模板分离编译 问题分析 解决方法 非类型模板参数 模板的参数分为两种,一种是非类型参数,一种是类型参数. ...
- 非类型模板参数(参考《C++ Templates 英文版第二版》)
非类型模板参数(参考<C++ Templates 英文版第二版>) Chapter 3 3.1 非类型类模板参数 与前几章的简单例子不同,你也可以通过std::array实例化一个固定大小 ...
- 浅谈非类型模板参数、模板的特化
非类型模板参数 1.模板参数分类类型形参与非类型形参. 2.类型形参即:出现在模板参数列表中,跟在class或者typename之类的参数类型名称.类型参数也可以给缺省值 3.非类型形参,就是用一个常 ...
- C++模板(函数模板,类模板)的基本使用与非类型模板参数与模板的特化
C++模板 模板初阶 泛型编程 函数模板 函数模板概念 函数模板格式 函数模板的原理 函数模板的实例化 隐式实例化 显式实例化:在函数名后的<>中指定模板参数的实际类型 模板参数的匹配原则 ...
最新文章
- SAP HUM LT27可以看一个HU相关的TO单历史
- OpenCart之商品管理教程
- Dbvis数据库连接工具将查询出数据转化为sql插入语句方法
- Win10 ancona傻瓜安装tensorflow-gpu,ancona傻瓜安装pytorch-gpu
- iPhone 13发售日期偷跑:9月17日全系开售、共4款
- 深入浅出学习Hibernate框架(一):从实例入手初识Hibernate框架
- android+主界面所有应用程序图标添加统一背景主题,Android 4.0替Launcher主界面所有应用程序图标添加统一背景主题...
- 关于主键的设计、primary key
- 单例设计模式之安全的懒汉式
- 【程序设计】哨兵控制器
- list遍历_Qt 容器类之遍历器和隐式数据共享
- php图片合并png保存图片大小,php缩放处理png和jpg图片
- svn: E155007 和 E155004
- 爱与光 android4.0学习
- unityShader
- gradle教程java_Gradle教程系列 ——Gradle基本语法
- AntDsign菜单高亮
- 夜深人静写算法(二) - 动态规划
- 磁共振线圈分类_磁共振检查的线圈选择
- 利用pygame实现大鱼吃小鱼游戏
热门文章
- idea常用的快捷键
- Lambda表达式有参数有返回值的练习(自定义接口)
- 递归-递归的特点及基本代码演练
- 云服务器 web网站吗,web云服务器免费的吗
- sql相同顺序法和一次封锁法_率土之滨追击战法攻略
- linux音频框架分析,Alsa音频子系统Codec---al5623.c内核代码框架分析
- beta分布_浅谈脑电的beta频段振荡
- django为什么需要子进程,如何关闭子进程,linux状态
- Linux---输入与输出函数总结
- 深入理解javascript系列(十七):函数柯里化