C++Primer Plus 第十四章代码重用:14.4.4 数组模板示例和非类型参数2

14.4.4 数组模板示例和非类型参数

提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加
例如:第一章 Python 机器学习入门之pandas的使用


提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 14.4.4 数组模板示例和非类型参数
  • 模板多功能性14.4.5
    • 1.递归使用模板
  • 程序清单 14.18 twod.cpp
    • 2.使用多个类型参数
  • 程序清单 14.19pairs.cpp


模板多功能性14.4.5

可以将用于常规类的技术用于模板类。模板类可用作基类,也可用作组件类,还可用作其他模板的类型参数。例如,可以使用数组模板实现栈模板,也可以使用数组模板来构造数组–数组元素是基于栈模板的栈。即可以编写下面的代码:

template<typenameT>or<class T>
class Array
{
private:T entry;};
template <typename Type>
class GrowArray :public Array<Type>{...);// inheritance
template <typename Tp>
class Stack
{
//use an rray<>as a component
Array<Tp> ar;
...
};
Array <Stack<int>>asi;//an array of stacks of int

在最后一条语句中,C++98要求使用至少一个空白字符将两个>符号分开,以免与运算符>>混淆。C++11不要求这样做。

1.递归使用模板

另一个模板多功能性的例子是,可以递归使用模板。例如,对于前面的数组模板定义,可以这样使用它:

ArrayTP< ArrayTP<int,5>10> twodee;

这使得twodee 是一个包含 10个元素的数组,其中每个元素都是一个包含5个 int 元素的数组。与之等价的常规数组声明如下:

int twodee[10][5];

请注意,在模板语法中,维的顺序与等价的二维数组相反。程序清单14.18使用了这种方法,同时使用 ArayTP模板创建了一维数组,来分别保存这10个组(每组包含5个数)的总数和平均值。方法调用cout.width(2)以两个字符的宽度显示下一个条目(如果整个数字的宽度不超过两个字符)。

程序清单 14.18 twod.cpp

// twod.cpp -- making a 2-d array
#include <iostream>
#include "arraytp.h"
int main(void)
{using std::cout;using std::endl;ArrayTP<int, 10> sums;ArrayTP<double, 10> aves;ArrayTP< ArrayTP<int,5>, 10> twodee;int i, j;for (i = 0; i < 10; i++){sums[i] = 0;for (j = 0; j < 5; j++){twodee[i][j] = (i + 1) * (j + 1);sums[i] += twodee[i][j];}aves[i] = (double) sums[i] / 10;}for (i = 0; i < 10; i++){for (j = 0; j < 5; j++){cout.width(2);cout << twodee[i][j] << ' ';}cout << ": sum = ";cout.width(3);cout  << sums[i] << ", average = " << aves[i] << endl;}cout << "Done.\n";// std::cin.get();return 0;
}

下面是程序清单 14.18所示程序的输出。在twodee 的10个元素(每个元素又是一个包含5个元素的数组)中,每个元素对应于1行:列出了每个元素包含的值、这些值的总和以及平均值。
在这里插入图片描述

2.使用多个类型参数

模板可以包含多个类型参数。例如,假设希望类可以保存两种值,则可以创建并使用Pair 模板来保存两个不同的值(标准模板库提供了类似的模板,名为 pair)。程序清单 14.19 所示的小程序是一个这样的示例。其中,方法 first()const和second()const报告存储的值,由于这两个方法返回 Pair 数据成员的引用,因此让您能够通过赋值重新设置存储的值。

程序清单 14.19pairs.cpp

// pairs.cpp -- defining and using a Pair template
#include <iostream>
#include <string>
template <class T1, class T2>
class Pair
{
private:T1 a;T2 b;
public:T1 & first();T2 & second();T1 first() const { return a; }T2 second() const { return b; }Pair(const T1 & aval, const T2 & bval) : a(aval), b(bval) { }Pair() {}
};template<class T1, class T2>
T1 & Pair<T1,T2>::first()
{return a;
}
template<class T1, class T2>
T2 & Pair<T1,T2>::second()
{return b;
}int main()
{using std::cout;using std::endl;using std::string;Pair<string, int> ratings[4] ={Pair<string, int>("The Purpled Duck", 5),Pair<string, int>("Jaquie's Frisco Al Fresco", 4),Pair<string, int>("Cafe Souffle", 5),Pair<string, int>("Bertie's Eats", 3)};int joints = sizeof(ratings) / sizeof (Pair<string, int>);cout << "Rating:\t Eatery\n";for (int i = 0; i < joints; i++)cout << ratings[i].second() << ":\t "<< ratings[i].first() << endl;cout << "Oops! Revised rating:\n";ratings[3].first() = "Bertie's Fab Eats";ratings[3].second() = 6;cout << ratings[3].second() << ":\t "<< ratings[3].first() << endl;// std::cin.get();return 0; 
}

对于程序清单 14.19,需要注意的一点是,在main()中必须使用 Pair<string,int>来调用构造函数,并将它作为 sizeof的参数。这是因为类名是Pair<string,int>,而不是Pair。另外,Pair<char *,double>是另一个完全不同的类的名称。

3.默认类型模板参数
类模板的另一项新特性是,可以为类型参数提供默认值:template <class Tl,class T2=int>class Topo…;这样,如果省略T2的值,编译器将使用int:

Topo<double,double>ml;//Tl is double,T2 is doubleTopo<double>m2;//Tl is double,T2 is int

第16章将讨论的标准模板库经常使用该特性,将默认类型设置为类。虽然可以为类模板类型参数提供默认值,但不能为函数模板参数提供默认值。然而,可以为非类型参数提供默认值,这对于类模板和函数模板都是适用的。


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

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

相关文章

《分析模式》漫谈08-单继承不是“唯一继承”

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 《分析模式》第2章这一段&#xff1a; 划线处的single inheritance&#xff0c;2004中译本的翻译&#xff1a; 翻译为“单继承”&#xff0c;是正确的。 2020中译本的翻译&#xff1a…

Java NIO(一) 概述

NIO主要用于以少量线程来管理多个网络连接&#xff0c;处理其上的读写等事件。在大量连接情况下&#xff0c;不管是效率还是空间占用都要优于传统的BIO。 Java NIO 由以下几个核心部分组成&#xff1a; Channel Buffer Selector Selector 如果你的应用打开了多个连接&#x…

分页插件 count有数据,代码不往下执行

如下:如果打印了sql那么当row>0时会有图2下面sql详情的输出 问题出在了分页参数上,pageNum为1,并且pageSize>2才能打印出图二的结果,图一为pageNum值是0,注意,查询第一页,分页应该传入的是1而不是0

Linux高并发服务器开发(六)线程

文章目录 1. 前言2 线程相关操作3 线程的创建4 进程数据段共享和回收5 线程分离6 线程退出和取消7 线程属性&#xff08;了解&#xff09;8 资源竞争9 互斥锁9.1 同步与互斥9.2 互斥锁 10 死锁11 读写锁12 条件变量13 生产者消费者模型14 信号量15 哲学家就餐 1. 前言 进程是C…

【FFmpeg】avio_open2函数

【FFmpeg】avio_open2函数 1.avio_open21.1 创建URLContext&#xff08;ffurl_open_whitelist&#xff09;1.1.1 创建URLContext&#xff08;ffurl_alloc&#xff09;1.1.1.1 查找合适的protocol&#xff08;url_find_protocol&#xff09;1.1.1.2 为查找到的URLProtocol创建UR…

通信系统网络架构_3.移动通信网络架构

移动通信网为移动互联网提供了强有力的支持&#xff0c;尤其是5G网络为个人用户、垂直行业等提供了多样化的服务。以下从业务应用角度给出面向5G网络的组网方式。 1.5GS与DN互连 5GS&#xff08;5G System&#xff09;在为移动终端用户&#xff08;User Equipment&#xff0c;…

BLACKBOX.AI:解锁开发新纪元,加速编程学习的AI神器!

文章目录 &#x1f4af;BLACKBOX.AI 官网&#x1f341;1 BLACKBOX.AI 工具使用教程&#x1f341;2 BLACKBOX.AI工具使用界面介绍&#x1f341;3 Chat(聊天)功能&#x1f341;4 Explore (探索)功能&#x1f48e;4.1 Terminal(终端)功能&#x1f48e;4.2 Discover(发现)功能&…

STM32 IWDG(独立看门狗)

1 IWDG简介 STM32有两个看门狗&#xff1a;一个是独立看门狗&#xff08;IWDG&#xff09;&#xff0c;另外一个是窗口看门狗。独立看门狗也称宠物狗&#xff0c;窗口看门狗也称警犬。本文主要分析独立看门狗的功能和它的应用。 独立看门狗用通俗一点的话来解释就是一个12位的…

关于转BigDecimal对象时,精度问题

//浮点型数值Double d 0.0003d;//转BigDecimal对象BigDecimal a new BigDecimal(d);System.out.println(String.format("浮点类型数字:%.4f创建BigDecimal对象并且保留多位小数并且保留多位小数时,精度会变多,结果为%s",d,a.setScale(8, BigDecimal.ROUND_DOWN)));…

format()方法——格式化字符串

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 语法介绍 format()可以对数据进行格式化处理操作&#xff0c;语法如下&#xff1a; format(value, format_spec) format_spec为格式化解释。当参数…

【计算机毕业设计】092基于微信小程序二手闲置交易市场

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

探索区块链:颠覆性技术的崛起

目录 一、引言 二、区块链技术概述 三、区块链应用场景 四、区块链面临的挑战 五、区块链的未来展望 六、结语 一、引言 在数字化浪潮的推动下&#xff0c;区块链技术以其独特的去中心化、透明性和不可篡改性等特性&#xff0c;正在逐步改变我们的生活。从金融领域到供应…

基于Java的茶文化交流系统【附源码+LW】

摘 要 计算机网络发展到现在已经好几十年了&#xff0c;在理论上面已经有了很丰富的基础&#xff0c;并且在现实生活中也到处都在使用&#xff0c;可以说&#xff0c;经过几十年的发展&#xff0c;互联网技术已经把地域信息的隔阂给消除了&#xff0c;让整个世界都可以即时通话…

MySQL数据库存储引擎

MySQL数据库存储引擎 存储引擎概念 存储引擎也称为表类型 通过不同的技术比如说&#xff0c;存储机制&#xff0c;索引技巧&#xff0c;锁定水平等等&#xff0c;来提供不同的功能。 查看MySQL支持的存储引擎 show engines\G&#xff1b; 常用引擎比较 对事务有需求 innodb …

TiDB-从0到1-数据导出导入

TiDB从0到1系列 TiDB-从0到1-体系结构TiDB-从0到1-分布式存储TiDB-从0到1-分布式事务TiDB-从0到1-MVCCTiDB-从0到1-部署篇TiDB-从0到1-配置篇TiDB-从0到1-集群扩缩容 一、数据导出 TiDB中通过Dumpling来实现数据导出&#xff0c;与MySQL中的mysqldump类似&#xff0c;其属于…

JavaWeb——MySQL:navicate客户端工具简单使用

目录 1. 连接 2. 新建数据库 3. 使用数据库 4. 新建表 5.使用表 6. 导出数据库 我这里是英文版&#xff0c;没有进行汉化。 1. 连接 点击左上角Connection&#xff0c;选择MySQL&#xff0c;&#xff08;我连接的是自己计算机上的数据库&#xff09;连接名输入&#x…

抖音开放平台运营同学联系我了,非常感谢

大家好&#xff0c;我是小悟 是怎么个事呢&#xff1f; 前几天在对接抖音开放平台&#xff0c;服务商代开发小程序里面的小程序备案&#xff0c;上传备案图片接口遇到了问题&#xff0c;具体的问题可详阅【抖音开放平台&#xff0c;这谁写的&#xff0c;要扣绩效吧】。 评论…

Java编程基本功大揭秘 | 详解深入分析Java线程池源码和底层原理,掌握实战技巧【1】

详解深入分析Java线程池源码和底层原理 文章大纲引言Java线程池概念及重要性 ThreadPoolExecutor类的概述ThreadPoolExecutor类的基本功能和作用**基本功能****核心作用** ThreadPoolExecutor主要构造函数及其参数继承关系链功能介绍ThreadPoolExecutor 构造器构造器参数构造器…

破解对LabVIEW的偏见

LabVIEW被广泛应用于科学研究、工程测试和自动化控制领域&#xff0c;具有专业性和高效的开发能力。尽管有人对其存在偏见&#xff0c;认为不如C语言&#xff0c;但LabVIEW的图形化编程、强大集成能力、丰富社区支持和专业功能&#xff0c;使其在许多实际应用中表现出色。通过多…

Go语言环境安装

Go下载地址 哪个能用用哪个。 https://go.dev/ https://golang.google.cn/&#xff08;Golang官网的官方镜像&#xff09; Windows 使用.msi安装包安装 下载msi文件 安装 双击运行go1.22.4.windows-amd64.msi Next 勾选I accept the terms in the License Agreement&…