算是模板使用的一种技巧

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

#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. 新手入门深度学习 | 第六篇:TensorFlow2 回调极速入门
  2. java8模拟grouby方法
  3. 给女朋友讲ActiveMQ是啥?
  4. mysql error 1114,mysql error 1114 table is full 处理分享
  5. python字符串是什么_python字符串表示什么
  6. 小米答题题库_拼多多果园答题题库74(每日更新)
  7. fread 和 read的区别
  8. 移动端vant时间选择器_vue移动端组件库(vant)
  9. javascript简介和基本语法
  10. python和web前端哪个容易_Python和Web前端选择哪个比较合适?
  11. 【TSP】基于matlab GUI混合粒子群算法求解旅行商问题【含Matlab源码 925期】
  12. 【敏捷开发每日一贴】代码走查
  13. 使用CSF对kitti的点云数据过滤出地面点云,结合PCL使用,C++实现
  14. JAVA JNI调用科大讯飞离线语音合成Windows
  15. iOS 15.0 和 Xcode 13更新
  16. CC2530串口命令控制LED灯开关
  17. 局域网频繁掉线解决办法
  18. 微信小程序开发—引用公共js里的方法
  19. 毕业设计第8周学习记录
  20. 微信小程序手机软键盘距离input输入框位置

热门文章

  1. 编码引出的问题_FileReader读取GBK格式的文件
  2. POI的入门:绘制图形
  3. plsql(轻量版)_记录类型1
  4. ActiveMQ专题
  5. mybatis 批量将list数据插入到数据库
  6. php socket 效率,php socket 模型及效率问题
  7. Shell文件的排序、合并和分割
  8. zsh和bash的切换,默认shell,alias拼接组合多条命令
  9. 210130阶段三socket服务器
  10. 【报错笔记】运行Maven项目时发现项目Build错误