【C++】类模板(二)类模板、函数模板、常量表达式与默认参数值、模板参数设计策略、成员模板函数

实现一个类模板

格式:

template<typename 占位符>(inline) 返回类型 模板类类名<自定义类型名>::
模板类成员函数名(const 自定义类型名 &参数名)

一个以函数模板完成的<<运算符

//非模板函数形式
ostream& operator<<(ostream&,const BinaryTree<int>& );//模板函数形式
template <typename elemType>
inline ostream&
operator<<( ostream &os,const BinaryTree<elemType>&bt)
{os << "Tree:" << endl;bt.print(os);return os;
}BinaryTree<string>bts;
cout<<bts<<endl;
//编译器将elemType指定为string,产生一个对应的<<运算符BinaryTree<int>bti;
cout<<bti<<endl;
//编译器将elemType指定为int,产生一个对应的<<运算符

常量表达式与默认参数值

也可以用常量表达式作为模板参数:

template<int len,int beg_pos>class num_sequence
{
public:virtual ~num_sequence(){};int elem(int pos)const;const char* what_am_i()const;static int max_elems(){return _max_elems;}ostream& print(ostream &os=cout) const;protected:virtual void gen_elems(int pos) const = 0;bool check_integrity(int pos,int size)const;num_sequence(vector<int>*pe):_pelems(pe){}static const int _max_elems = 1024;vector<int> *_pelems;
};
template<int length, int beg_pos = 1>//带有默认参数值
class Fibonacci:public num_seuqence<length,beg_pos>
{
public:Fibonacci():num_sequence<length,beg_pos>(&_elems){}protected:virtual void gen_elems(int pos)const;static vector<int> _elems;
};

全局作用域内的函数和对象,其地址也是一种常量表达式,因此可以用来表达模板参数:

template<void (*pf)(int pos, vector<int> &seq)>class numeric_sequence
{
public:numeric_sequence(int len,int beg_pos = 1){if(!pf)//....产生错误信息并退出{...}private:int _len;int _beg_pos;vector<int> _elems;
};//使用
//pf指向“依据特定数列类型,产生pos个元素,放到vector seq内”的函数
void fibonacci(int pos,vector<int>&seq);
void pell(int pos,vector<int>&seq);
//...
numeric_seuqence<fibonacci> ns_fib(12);
numeric_seuqnece<pell> ns_peel(18,8);

以模板参数作为一种设计策略

将某种特定的命名规范强加于被当作参数的类身上:每个类都必须提供类模板中调用到的函数。

template<typename num_seq>
class NumericSequence{
public:NumericSequence(int len=1,int bpos=1):_ns(len,bpos){}//以下会通过函数的命名规范,调用未知的数列类中的同名函数//此处所谓函数命名规范是:每个num_seq参数类都必须提供//名为calc_elems和is_elem的函数void calc_elems(int sz) const {_ns.calc_elems(sz);}bool is_elem(int elem) const {return _ns.is_elem(elem);}//...private:num_seq _ns;
};

成员模板函数

非模板类里定义成员模板函数:
在只写一份函数定义的情形下,支持任何类型。

class PrintIt
{
public:PrintIt(ostream &os):_os(os){}//成员模板函数
template<typename elemType>
void print(const elemType &elem,char delimiter='\n')
{_os << elem << delimiter;
}
private:ostream &os;
}

模板类里定义成员模板函数:

template<typename OutStream>
class PrintIt{
public:PrintIt(OutStream &os):_os(os){}//成员模板函数template <typename elemType>void print(const elemType &elem,char delimiter='\n'){_os<<elem<<delimiter;}
private:ostream& _os;
};

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

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

相关文章

【Zabbix】Zabbix学习笔记

现在Zabbix Server存在的问题&#xff1a; 问题1&#xff1a; Zabbix server: Utilization of discoverer processes over 75% 问题2&#xff1a; Zabbix server: Utilization of icmp pinger processes over 75% 优化的解决办法是修改配置文件把Discovery和Pinger进程数量调大…

MySQL MVCC详细介绍

MVCC概念 MVCC(Multi-Version Concurrency Control) 多版本并发控制&#xff0c;是一种并发控制机制,用于处理数据库中的并发读写操作&#xff0c;它通过在每个事务中创建数据的快照&#xff0c;实现了读写操作的隔离性&#xff0c;从而避免了读写冲突和数据不一致的问题。 M…

JAVA设计模式-适配器模式

一.概念 ​ 将一个接口转换成客户希望的另一个接口&#xff0c;使接口不兼容的那些类可以一起工作&#xff0c;其别名为包装器(Wrapper)。适配器模式既可以作为类结构型模式&#xff0c;也可以作为对象结构型模式。 ​ 在适配器模式中&#xff0c;我们通过增加一个新的适配器…

Mac设置终端代理快捷命令

编辑配置文件 vim ~/.zshrc添加如下内容&#xff1a; alias proxyexport all_proxysocks5://127.0.0.1:1080 alias unproxyunset all_proxy更新配置 source ~/.zshrc测试 curl ipinfo.io使用 # 开启 proxy # 关闭 unproxy原文地址&#xff1a;https://www.hangge.com/blog…

SpringBootCms

SpringBootCMS&#xff0c;极速开发&#xff0c;动态添加字段&#xff0c;自定义标签&#xff0c;动态创建数据库表并crud数据&#xff0c;数据库备份、还原&#xff0c;动态添加站点(多站点功能)&#xff0c;一键生成模板代码&#xff0c;让您轻松打造自己的独立网站&#xff…

Redisson使用延时队列

延时队列 在开发中&#xff0c;有时需要使用延时队列。 比如&#xff0c;订单15分钟内未支付自动取消。 jdk延时队列 如果使用 jdk自带的延时队列&#xff0c;那么服务器挂了或者重启时&#xff0c;延时队列里的数据就会失效&#xff0c;可用性比较差。 Redisson延时队列 …

Linux文件-内存映射mmap

mmap定义为&#xff1a;Linux通过将一个虚拟内存区域与一个磁盘上的对象(object)关联起来&#xff0c;以初始化这个虚拟内存区域的内容&#xff0c;这个过程称为内存映射(memory mapping)。 在LINUX中我们可以使用mmap用来在进程虚拟内存地址空间中分配地址空间&#xff0c;创…

基于Vue构建的快速开发框架

一、Vue结合低代码 "低代码"是一种快速开发应用的方法&#xff0c;它使开发者能够通过图形界面和预构建的块进行设计和构建&#xff0c;而不是手动编写大量的代码。这种方法被广泛用于快速应用开发、移动应用开发、业务流程管理和数据库应用开发等领域。 Vue.js 是一…

leetCode 115.不同的子序列 动态规划 + 滚动数组(优化)

给你两个字符串 s 和 t &#xff0c;统计并返回在 s 的 子序列 中 t 出现的个数&#xff0c;结果需要对 10^9 7 取模 示例 1&#xff1a; 输入&#xff1a;s "rabbbit", t "rabbit" 输出&#xff1a;3 解释&#xff1a;如下所示, 有 3 种可以从 s 中得…

spring:详解spring MVC

spring MVC SpringMVC是一种基于Java的MVC&#xff08;Model-View-Controller&#xff09;Web开发框架&#xff0c;通过将业务逻辑、数据和界面分离&#xff0c;使得开发人员能够更高效地管理和维护代码&#xff0c;提高应用的可扩展性和可维护性。 SpringMVC核心概念 Contr…

关于:未同意隐私政策,应用获取ANDROID ID问题2

一、环境 Unity2018 4.21f1、Android Studio、Windows10 二、问题描述 在发布应用到华为应用市场时&#xff0c;提示“在用户同意隐私政策前&#xff0c;您的应用获取了用户的ANDROID ID&#xff0c;不符合华为应用市场审核标准。” 如果你想去掉获取ANDROID ID的代码可以参…

Webmin远程命令执行漏洞复现报告

漏洞编号 CVE-2019-15107 漏洞描述 Webmin是一个基于Web的系统配置工具&#xff0c;用于类Unix系统。密码重置页面中存在此漏洞&#xff0c;允许未经身份验证的用户通过简单的 POST 请求执行任意命令。 影响版本 Webmin<1.920 漏洞评级 严重 利用方法&#xff08;利…

STM32MP157按键中断实验

按键配置 #include "key_it.h" #include "stm32mp1xx_gpio.h" #include "stm32mp1xx_gic.h" #include "stm32mp1xx_exti.h" #include "stm32mp1xx_rcc.h"void key_it_config() {/* RCC使能GPIOF时钟 */RCC->MP_AHB4ENSE…

ubuntu20.04 nerf Instant-ngp (下) 复现,自建数据集,导出mesh

参考链接 Ubuntu20.04复现instant-ngp&#xff0c;自建数据集&#xff0c;导出mesh_XINYU W的博客-CSDN博客 GitHub - NVlabs/instant-ngp: Instant neural graphics primitives: lightning fast NeRF and more youtube上的一个博主自建数据集 https://www.youtube.com/watch…

es6(二)——常用es6说明

ES6的系列文章目录 es6&#xff08;一&#xff09;——var和let和const的区别 文章目录 ES6的系列文章目录一、变量的结构赋值1.数组的结构赋值2.对象的结构赋值 二、模板字符串三、扩展运算符1.字符串的使用2.数组的使用 四、箭头函数1.普通函数的定义2.箭头函数的定义3.箭头…

Windows 10 - 适用于各种服务(Redis、MySQL)的文件迁移到其他目录后,导致的各种服务找不到的问题 - 注册服务 - 关闭服务 - 重启服务

目录 一、MySQL 服务找不到问题二、Redis 服务找不到问题Tips 三、PostgreSQL 服务找不到问题参考链接 必须要用管理员打开 doc 窗口&#xff0c;然后才进行以下操作。 通用命令 先关闭 xxx 服务 sc query xxx服务名&#xff0c;如 redis 服务 sc query redis sc query 删除…

uniapp app获取keystore等一系列常用数据

https://blog.csdn.net/deepdfhy/article/details/88698492 参考文章 一、获取安卓证书keystore的SHA1和SHA256值 参数上面引用链接 window r : $ cmd $ D: 进入D盘 $ keytool -genkey -alias testalias -keyalg RSA -keysize 2048 -validity 36500 -keystore 项目名称.ke…

[GXYCTF2019]BabyUpload - 文件上传+绕过(后缀文件类型文件内容.htaccess)

[GXYCTF2019]BabyUpload 解题流程 解题流程 1、上传一句话&#xff0c;提示“后缀不允许ph” 2、修改后缀为jpg&#xff0c;提示“上传类型也太露骨了吧&#xff01;” 3、修改类型为image/jpeg&#xff0c;提示“诶&#xff0c;别蒙我啊&#xff0c;这标志明显还是php啊” 4、…

【Linux 安装Kibana 及 Es 分词器安装】

一、客户端Kibana安装 Kibana是一个开源分析和可视化平台&#xff0c;旨在与Elasticsearch协同工作。参考文档 1. 下载并解压缩Kibana 下载路径 选择的版本是和 ElasticSearch 对应&#xff08;7.17.3&#xff09; 下载后上传到Linux 系统中&#xff0c;并放在 /root/ 下&a…

Linux编译FFmpeg

Linux编译FFmpeg 1. 下载FFmpeg源码 FFmpeg源码下载地址&#xff1a;http://ffmpeg.org/download.html 在下面选择版本 2. 解压并创建生成目录 tar xvf ffmpeg-snapshot.tar.bz2 // 解压下载的FFmpeg源码 makedir /root/ffmpeg // 创建生成目录3. 编译FFmpeg 进入FF…