非类型模板参数

对于函数模板与类模板,模板参数并不局限于类型,普通值也可以作为模板参数。在基于类型参数的模板中,你定义了一些具体的细节来加以确定代码,直到代码被调用时这些细节才被真正的确定。但是在这里,我们面对的是这些细节是值,而不是类型,当要使用基于值的模板时,必须显式地指定这些值,才能够对模板进行实例化。

非类型的类模板参数

 

创建类的头文件

#include<stdexcept>
#include<iostream>
using namespace std;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 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 out_of_range("Stack<>::pop(): stack is full");}--numElems;
}template<typename T, int MAXSIZE>
T Stack<T, MAXSIZE>::top() const
{if(numElems <= 0) {throw out_of_range("Stack<>::top(): stack is full");}return elems[numElems - 1];
}

#include<stdexcept>
#include<iostream>
using namespace std;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 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 out_of_range("Stack<>::pop(): stack is full");}--numElems;
}template<typename T, int MAXSIZE>
T Stack<T, MAXSIZE>::top() const
{if(numElems <= 0) {throw out_of_range("Stack<>::top(): stack is full");}return elems[numElems - 1];
}

实现代码:

#include<iostream>
#include<vector>
#include<deque>
#include<stdexcept>
#include<string>
#include<cstdlib>
#include "stack4.h"
using namespace std;int main()
{try {Stack<int, 20> int20Stack;Stack<int, 40> int40Stack;Stack<string, 40> stringStack;int20Stack.push(7);cout<<int20Stack.top()<<endl;int20Stack.pop();stringStack.push("hello");cout<<stringStack.top()<<endl;stringStack.pop();stringStack.pop();}catch(exception const& ex) {cerr<<"Exception: "<<ex.what()<<endl;//return EXIT_FAILURE;}cin.get();  return 0;
}

#include<iostream>
#include<vector>
#include<deque>
#include<stdexcept>
#include<string>
#include<cstdlib>
#include "stack4.h"
using namespace std;int main()
{try {Stack<int, 20> int20Stack;Stack<int, 40> int40Stack;Stack<string, 40> stringStack;int20Stack.push(7);cout<<int20Stack.top()<<endl;int20Stack.pop();stringStack.push("hello");cout<<stringStack.top()<<endl;stringStack.pop();stringStack.pop();}catch(exception const& ex) {cerr<<"Exception: "<<ex.what()<<endl;//return EXIT_FAILURE;}cin.get();  return 0;
}

MAXSIZE是新加入的第二个模板参数,类型为int,它指定了数组最多可包含的栈元素的个数
同样,我们可以为模板参数指定缺省值:

template<typename T = int, int MAXSIZE = 100>
class Stack {...
};

  非类型的函数模板参数

你也可以为函数模板定义非类型参数。例如:

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

借助于STL,可以传递这个函数模板的实例化给集中的每一个元素,让他们都增加一个整数值:

std::transform(source.begin(), source.end(), dest.begin(), (int(*)(int const&))addValue<int, 5>);

  非类型模板参数的限制

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

浮点数和类对象是不允许作为非类型模板参数的:

template<double VAT>
double process(double v) //error
{return V * VAT;
}template<string name>  //error
class MyClass {...
};

  另外,你也不能使用全局指针作为模板参数

template<char const* name>
class MyClass{...
};char const* s = "hello";
MyClass<s> x;   //s是一个指向内部连接对象的指针

但是你可以这样使用:

template<char const* name>
class MyClass {...
};extern char const s[] = "hello";
MyClass<s> x;  //OK

全局字符数组s由"hello"初始化,是一个外部链接对象

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/298938.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深度学习框架PyTorch与TensorFlow,谁更胜一筹?

全世界只有3.14 % 的人关注了爆炸吧知识自从2012年深度学习再一次声名鹊起以来&#xff0c;许多机器学习框架都争先恐后地要成为研究人员和行业从业者的新宠。面对如些众多的选择&#xff0c;人们很难判断最流行的框架到底是什么。在某些情况下&#xff0c;深度学习或深度迁移学…

PHP如何防采集方法代码

1 <?php 2 /**3 * FileName:test.php4 * Summary: 防采集5 * Author: sinob6 * CreateTime: 2005-10-18 7 * LastModifed:2005-10-18 8 * 请参见http://mall.yi85.com/9 */10 $HTTP_REFERER$_SERVER["HTTP_REFERER"];11 $HTTP_USER_AGENT$_SERVER["HTTP_USE…

Windows Server 2008 R2 之二十一远程桌面服务RD之二

一、远程桌面授权 远程桌面授权&#xff08;RD 授权&#xff09;以前称为终端服务授权&#xff08;TS 授权&#xff09;&#xff0c;它能够管理每个设备或用户与远程桌面会话主机&#xff08;RD 会话主机&#xff09;服务器连接所需的远程桌面服务客户端访问许可 (RDS CAL)。使…

件工程项目开发最全文档模板_一文带你了解微信小程序社区和小程序开发

微信小程序越来越受欢迎&#xff0c;很多小白也想制作自己的小程序。小白若想自己顺利制作&#xff0c;有两种方法&#xff1a;一种是下载安装微信官方开发者工具&#xff0c;然后写代码开发&#xff1b;一种是使用第三方小程序制作工具&#xff0c;选个现成的小程序模板&#…

php 单例模式的类,用单例模式来设计一个PHP数据库类

class nmdb{private $link;static private $_instance;// 连接数据库private function __construct($host, $username, $password){$this->link mysql_connect($host, $username, $password);$this->query("SET NAMES utf8", $this->link);//echo mysql_er…

Windows 11 预览版 Build 22000.168 发布

微软现已发布第八个 Windows 11 预览版更新 KB5005191&#xff0c;版本号升级至 Build 22000.168。本次更新面向 Beta 频道和 Dev 频道的 Windows 预览体验成员推出&#xff0c;Windows 11 Insider Preview Build 22000.168 主要变化如下。1.微软宣布 Microsoft Teams 现已支持…

如何扩展开发团队(转)

原文标题&#xff1a;How To Scale a Development Team 原文链接&#xff1a;http://adam.heroku.com/past/2011/4/28/scaling_a_development_team/ 作者通过自己在Heroku的经验&#xff0c;讨论了开发团队是如何从家庭式作坊发展到专业化团队的过程&#xff0c;在每个阶段中都…

sqlserver全文索引问题

把噪声词定义文件清空就成了&#xff0c;FTData\noiseCHS.txt机制不是很明白&#xff0c;不过在清噪声词定义后&#xff0c;确实是连标点符号都能全文搜索了。 数据存储编码有问题&#xff0c;用nvarchar转载于:https://www.cnblogs.com/freedom831215/archive/2010/11/09/1872…

都2020年了,翟天临对毕业生论文查重的影响还剩多少?

全世界只有3.14 % 的人关注了爆炸吧知识文内有福利2020年转眼就到了4月&#xff0c;对于20届的毕业生来说&#xff0c;这注定是一个不平凡的毕业季。然而&#xff0c;无论2020年经历了什么&#xff0c;在无数莘莘学子成为“社会人”之前&#xff0c;不得不面对一件事情&#xf…

思科路由器由于IP INPUT进程导致cpu负荷高的判断方法

IP INPUT负荷高的原因未在端口上打开快速转发选项&#xff1b; 解决方法&#xff1a;在端口上面打开快速转发&#xff0c;如CEF 当同一个端口主IP和辅助IP流量大的时候&#xff0c;未开启相关快速转发选项&#xff1b; 解决方法&#xff1a;端口上面打开&#xff1a;ip route-c…

apache 2.4 httpd.conf 详解_Linux Centos服务子系统详解

1、服务的分类启动与自启动&#xff1a;服务启动&#xff1a;就是在当前系统中让服务运行&#xff0c;并提供功能。服务自启动&#xff1a;自启动是指让服务在系统开机和重启之后&#xff0c;随着系统的启动而自动启动服务查询已安装的服务&#xff1a;RPM包安装的服务[rootloc…

Oracle 常用sql场景应用(未完待续......)

--1、创建一张学生信息表stuinfo&#xff0c;字段包括学号、姓名、性别、年龄、入学日期SQL>CREATE TABLE stuinfo (snochar(4),sname varchar2(10),sex int,age int,sdate date);Table created--2、创建stuinfo表主键约束SQL>ALTER TABLE stuinfo ADD CONSTRAINT pk_stu…

BeetleX.FastHttpApi之JWT和自定义访问验证

BeetleX.FastHttpApi.Jwt组件是BeetleX.FastHttpApi的JWT安全验证插件&#xff0c;通组件的简单配置即可以实现对webapi进行安全访问控制。接下来介绍如何使用这组件并和其他自定义验证兼容。使用本示例需要引用两个组件分别是:BeetleX.FastHttpApi.Hosting和BeetleX.FastHttpA…

(收藏)C#开源资源大汇总

一、AOP框架 Encase 是C#编写开发的为.NET平台提供的AOP框架。Encase 独特的提供了把方面(aspects)部署到运行时代码&#xff0c;而其它AOP框架依赖配置文件的方式。这种部署方面(aspects)的方法帮助缺少经验的开发 人员提高开发效率。 NKalore是一款编程语言&a…

一个漫长的程序人生路程,如何突破5000元大关?几年前的2-3线城市的参考,现在未必...

我是2000年参加工作的&#xff0c;第一年在宁波一所大学当老师&#xff0c;当时工资可能只有2K不到&#xff0c;由于我上大学时也经常给别人兼职打工&#xff0c;平均下来也能赚个每个月2K&#xff0c;问题不严重。本来计划是在大学一边当老师&#xff0c;一边在市区找找活儿干…

变态公式之如何算出圆的内部被切割成几块?

来来来赶紧拿纸笔出来一起算一个单位圆圆周上均匀分布 n 个点&#xff0c;互相连接&#xff0c;这个圆的内部会被分割为多少块&#xff1f;答案高能预警&#xff1a;来&#xff0c;我们来找规律&#xff0c;大家拿出纸和笔。前三个很简单&#xff0c;1,2,4&#xff0c;所以猜测…

qq截图工具提取_QQ截图隐藏的这些简单又实用的技能,怪我没早告诉你

自从有了微信&#xff0c;很多人逐渐习惯并适应微信办公、学习&#xff0c;远离 QQ。实际上&#xff0c;QQ 后面做了不少实用且高效得功能&#xff0c;往往容易被人忽略&#xff0c;例如强大的截图功能&#xff0c;具体好用在哪呢&#xff1f;看完下面的内容就知道了。01. 精准…

java io类库,Java利用io类库对各种文件的操作详解

Java中文网 - Java利用io类库对各种文件的操作详解java中提供了io类库&#xff0c;可以轻松的用java实现对文件的各种操作。下面就来说一下如何用java来实现这些操作。新建目录//String URL request.getRequestURI();String filePath"C:\\测试\\";filePathfilePath.…

合集 | 我在传统行业做数字化转型

在过去的两年时间里&#xff0c;Edison加入了一家传统行业的家装企业参与了其从0到1的数字化转型的过程&#xff0c;我将其整个过程中的感受与体会记录成了一些文章&#xff0c;分享与你。1我在传统行业做数字化转型&#xff08;1&#xff09;预告篇这篇主要会介绍一下数字化转…

第十周项目1-程序填空与阅读(一)

问题1-阅读下面的程序&#xff0c;在____上填上合适的成份&#xff0c;使程序能够输入“12”形式的式子&#xff0c;并输出相应的结果。 输入switch(oper) /**Copyright (c) 2014,烟台大学计算机学院*All gight reserved.*文件名称&#xff1a;temp.cpp*作者&#xff1a;邵帅*完…