算是模板使用的一种技巧

用模板当数组元素参数维度

#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相关推荐

  1. C++基础——非类型模板参数

    非类型类模板参数 非类型函数模板参数 非类型模板参数的限制 非类型模板参看,顾名思义,模板参数不限定于类型,普通值也可作为模板参数.在基于类型的模板中,模板实例化时所依赖的是某一类型的模板参数,你定义 ...

  2. C++非类型模板参数

    对于函数模板与类模板,模板参数并不局限于类型,普通值也可以作为模板参数.在基于类型参数的模板中,你定义了一些具体的细节来加以确定代码,直到代码被调用时这些细节才被真正的确定.但是在这里,我们面对的是这 ...

  3. C++知识点60——非类型模板参数

    模板参数不仅可以使类型,也可以是值.可以用特定的类型名(比如int)而非typename或者class表示非类型模板参数.当模板被实例化时,非类型模板参数会被一个值而不是类型替代.非类型模板参数 一. ...

  4. java两个函数名字相同_为什么C不允许两个具有相同名称的函数/类模板,只有非类型模板参数(整数类型)的类型不同?...

    我尝试这个时编译器会出错 . 我试过VC和g . 这同样适用于函数模板和类模板(但对于函数模板,只有在实例化函数模板时才会出现编译器错误;当编译器遇到第二个类定义时,会立即出现类模板的编译器错误) . ...

  5. C++17 非类型模板参数的auto 和 DevC++ 支持C++17

    模板参数分为两种,一种是类型模板参数,也是我们用得最多的一种: template <typename T, typename U> auto add(T t, U u) {     ret ...

  6. C++ 泛型编程(二):非类型模板参数,模板特化,模板的分离编译

    目录 非类型模板参数 函数模板的特化 类模板的特化 全特化 偏特化 部分参数特化 参数修饰特化 模板分离编译 问题分析 解决方法 非类型模板参数 模板的参数分为两种,一种是非类型参数,一种是类型参数. ...

  7. 非类型模板参数(参考《C++ Templates 英文版第二版》)

    非类型模板参数(参考<C++ Templates 英文版第二版>) Chapter 3 3.1 非类型类模板参数 与前几章的简单例子不同,你也可以通过std::array实例化一个固定大小 ...

  8. 浅谈非类型模板参数、模板的特化

    非类型模板参数 1.模板参数分类类型形参与非类型形参. 2.类型形参即:出现在模板参数列表中,跟在class或者typename之类的参数类型名称.类型参数也可以给缺省值 3.非类型形参,就是用一个常 ...

  9. C++模板(函数模板,类模板)的基本使用与非类型模板参数与模板的特化

    C++模板 模板初阶 泛型编程 函数模板 函数模板概念 函数模板格式 函数模板的原理 函数模板的实例化 隐式实例化 显式实例化:在函数名后的<>中指定模板参数的实际类型 模板参数的匹配原则 ...

最新文章

  1. SAP HUM LT27可以看一个HU相关的TO单历史
  2. OpenCart之商品管理教程
  3. Dbvis数据库连接工具将查询出数据转化为sql插入语句方法
  4. Win10 ancona傻瓜安装tensorflow-gpu,ancona傻瓜安装pytorch-gpu
  5. iPhone 13发售日期偷跑:9月17日全系开售、共4款
  6. 深入浅出学习Hibernate框架(一):从实例入手初识Hibernate框架
  7. android+主界面所有应用程序图标添加统一背景主题,Android 4.0替Launcher主界面所有应用程序图标添加统一背景主题...
  8. 关于主键的设计、primary key
  9. 单例设计模式之安全的懒汉式
  10. 【程序设计】哨兵控制器
  11. list遍历_Qt 容器类之遍历器和隐式数据共享
  12. php图片合并png保存图片大小,php缩放处理png和jpg图片
  13. svn: E155007 和 E155004
  14. 爱与光 android4.0学习
  15. unityShader
  16. gradle教程java_Gradle教程系列 ——Gradle基本语法
  17. AntDsign菜单高亮
  18. 夜深人静写算法(二) - 动态规划
  19. 磁共振线圈分类_磁共振检查的线圈选择
  20. 利用pygame实现大鱼吃小鱼游戏

热门文章

  1. idea常用的快捷键
  2. Lambda表达式有参数有返回值的练习(自定义接口)
  3. 递归-递归的特点及基本代码演练
  4. 云服务器 web网站吗,web云服务器免费的吗
  5. sql相同顺序法和一次封锁法_率土之滨追击战法攻略
  6. linux音频框架分析,Alsa音频子系统Codec---al5623.c内核代码框架分析
  7. beta分布_浅谈脑电的beta频段振荡
  8. django为什么需要子进程,如何关闭子进程,linux状态
  9. Linux---输入与输出函数总结
  10. 深入理解javascript系列(十七):函数柯里化