【C++】可变参数模板简单介绍
前言
可变参数模板是C++11中的新特性,它能够让我们创建可以接收可变参数的函数模板和类模板,相比C++98/03,类模版和函数模版中只能含固定数量的模版参数,可变模版参数是一个巨大的改进,通过系统系统推演数据的类型,不用自己写出模板参数类型。
下面我们来创建一个基本的的能够接收可变参数的函数模板:
template<class ...Args>
void ShowFunc(Args... args)
{
}
声明一个参数包Args... args,这个参数包中可以包含0到任意个模板参数。
上面代码中Args是一个模板参数包,args是一个函数形参参数包。
#include<iostream>
#include<string>
using namespace std;
template<class ...Args>
void ShowFunc(Args... args)
{cout << sizeof...(args) << endl;
}
int main()
{ShowFunc(1);ShowFunc(1, 1.1);ShowFunc(1, 1.1, 'A', std::string("sort"));return 0;
}
sizeof...(args)是计算该函数中含有多少个参数,即计算函数形参的个数。

下面我们来看一下如何使用可变参数的函数模板获取其参数包的值。
方法一:编译器编译时的递归推演:第一个模板参数依次解析获取参数包中的参数值。
#include<iostream>
#include<string>
using namespace std;// 递归终止函数
template <class T>
void ShowFunc(const T& t)
{cout << t << endl;
}
// 展开函数
template <class T, class ...Args>
void ShowFunc(T value, Args... args)
{cout << value << " ";ShowFunc(args...);
}
int main()
{ShowFunc(1);ShowFunc(1, 1.1);ShowFunc(1, 1.1, 'A', std::string("sort"));return 0;
}

方法二:利用逗号表达式展开参数包:初始化数组arr,强行让编译器解析参数包,参数包有几个参数,PrintArg就自动推演生成相应个。
#include<iostream>
#include<string>
using namespace std;template <class T>
void PrintArg(T t)
{cout << t << " ";
}
//展开函数
template <class ...Args>
void ShowFunc(Args... args)
{int arr[] = { (PrintArg(args), 0)... };cout << endl;
}
int main()
{ShowFunc(1);ShowFunc(1, 'A');ShowFunc(1, 'A', std::string("CSDN"));return 0;
}

相关文章:
【C++】可变参数模板简单介绍
前言 可变参数模板是C11中的新特性,它能够让我们创建可以接收可变参数的函数模板和类模板,相比C98/03,类模版和函数模版中只能含固定数量的模版参数,可变模版参数是一个巨大的改进,通过系统系统推演数据的类型…...
RabbitMQ--死信队列
目录 一、死信队列介绍 1.死信 2.死信的来源 2.1 TTL 2.2 死信的来源 3.死信队列 4.死信队列的用途 二、死信队列的实现 1.导入依赖 pom.xml 2.application.properties 3.配置类 4.生产者 5.业务消费者(正常消费者) 6.死信队列消费者 一、…...
微信小程序毕业设计-基于Java后端的微信小程序源码150套(附源码+数据库+演示视频+LW)
大家好!我是程序猿老A,感谢您阅读本文,欢迎一键三连哦。 🧡今天给大家分享150的微信小程序毕业设计,后台用Java开发,这些项目都经过精心挑选,涵盖了不同的实战主题和用例,可做毕业设…...
提前预知职业天赋!霍兰德职业兴趣测试API接口给你精准推荐
霍兰德职业倾向测验,它是美国著名职业指导专家J.霍兰德(HOLLAND)编制的,他的职业选择理论把职业分为六种不同类型,即现实型、研究型、艺术型、社会型、企业型、常规型。霍兰德认为,每个人都是这…...
js强大的运算符:??、??=
学习目标: js中强大的运算符 ?? 非空运算符 学习内容: ?? 非空运算符 注意:?? 运算符被称为非空运算符。如果第一个参数不是 null/undefined 将返回第一个参数,否则返回第二个参数 之前: 给变量设置默认值时…...
【MATLAB源码-第207期】基于matlab的单相光伏并网系统仿真,并网策略采用基于扰动观测法的MPPT模型和使用电压电流双闭环SPWM控制。
操作环境: MATLAB 2022a 1、算法描述 本文将重点分析光伏发电最大功率点跟踪(MPPT)技术和逆变器的并网控制技术,并在Simulink环境下建立模拟系统,以体现这些技术的应用与效果。文章结构如下:首先简介光伏…...
java发送请求-二次开发-get请求json
这里有2个判断 如果param为空则对url发送请求 再继续判断有值时,接口参数时json还是namevalue格式 因为json是带{,所以可以先写为param包含{}, 反之就是请求格式是url?param 请求json要带参数,所以需要使用setEntity方法, 最…...
Typescript高级: 对泛型和多态的应用, 实现Java中的ArrayList和LinkedList
ArrayList 1 ) 概述 在Java中,ArrayList是一个非常常用且强大的数据结构,它提供了动态数组的功能能够方便地添加、删除和访问元素。在TypeScript中,虽然并没有内置的ArrayList类型但我们可以通过类与接口来模拟实现ArrayList的功能 2 &…...
正则表达式常用特殊字符(元字符)说明
正则表达式中包含多种特殊字符(也称作元字符),它们具有特定的含义,用于构建复杂的匹配模式。以下是一些常用的特殊字符序列及其含义: \d - 匹配任何数字,等同于 [0-9]。\D - 匹配任何非数字字符࿰…...
使用hdc TCP模式无线方式连接OpenHarmony设备
本文将介绍如何使用hdc工具 tcp模式以无线的方式连接OpenHarmony设备。 1. usb连接方式切换为tcp模式。 将usb线将OpenHarmony设备和电脑端连接,并且将两个连接至同一个局域网。 # 执行 tmode port port-number,port-number设置为端口号。 hdc tmode …...
杂记-记一次前端打包问题解决过程
背景 若干年没更新发布的前端项目,突然来了个小需求,需求完成耗时5min,打包问题解决2小时 问题 error commander12.0.0: The engine “node” is incompatible with this module. Expected version “>18”. Got “10.22.1” 这个错误…...
维修ABB示教器主板DSQC679 3HAC 033624-001 /R机器人液晶显示屏深圳捷达工控维修
ABB 机器人示教器是工业环境中用于对机器人系统进行编程和控制的重要工具。这些手持设备允许操作员与机器人交互、输入命令并教它们特定的动作和任务。 每个 ABB 机器人示教器均专为用户友好型操作而设计,具有直观的界面和易于使用的人体工学设计。有多种型号可供选…...
原子学习笔记3——点亮 LED
一、应用层操控设备的两种方式 应用层如何操控底层硬件,同样也是通过文件 I/O 的方式来实现,设备文件便是各种硬件设备向应用层提供的一个接口,应用层通过对设备文件的 I/O 操作来操控硬件设备,譬如 LCD 显示屏、串口、按键、摄像…...
齐护K210系列教程(十八)_识别条码
识别条码 联系我们 将识别到的条形码内容打印输出并显示 测试条形码可以到如下网站得到:http://www.jsons.cn/barcode/ 4,课程资源 课程程序下载:【18条形码】 联系我们 扫码 或者点这里加群了解更多! Created by qdprobot...
K折交叉验证
训练数据稀缺,无法构成验证集。 所以我们将训练数据分为k个子集。 执行k次模型训练和验证。每次在k-1个子集上进行训练, 并在剩余的一个子集(该轮没有训练的子集)上进行验证。 最后,这k次实验结果取平均来估计训练和验…...
Docker 的 Ubuntu 操作系统镜像
Debian 和 Ubuntu 都是目前较为流行的 Debian 系列 的服务器操作系统,十分适合研发场景。 Debian 和 Ubuntu 属于同一系列的发行版。Debian 是由 Ian Murdock 在 1993 年创建的最初的发行版。Ubuntu 是 Mark Shuttleworth 在 2004 年基于 Debian 创建的发行版。 Li…...
【Python】Python中的logging模块介绍和示例
Python中的logging模块是一个强大的内置模块,用于记录和跟踪应用程序的运行过程。它提供了灵活的日志记录功能,可以将日志消息输出到多个目标(如控制台、文件、远程服务器等),并支持不同的日志级别。以下是logging模块…...
PXIe规格i3/i5/i7单板计算机控制器
是专为PXIe混合测试系统设计的主控制器,3U 12HP PXIe规格。该产品采用Intel Core™i3/i5/i7 第四代高性能处理器,内存可支持高达16G DDR3L。该系统PXI Express的link配置为通用的4Port 4lane的模式,数据吞吐量高达8GB/S。 CX786x提供丰富灵活…...
弱网对抗的策略有哪些?
在弱网环境下,数据传输可能会面临丢包、延迟、抖动等问题,因此采取合适的弱网对抗策略对于确保数据传输的稳定性和可靠性至关重要。以下是一些常见的弱网对抗策略: 数据压缩:使用压缩算法如Gzip、Brotli等对数据进行压缩…...
如何通过OMS加快大表迁移至OceanBase
OMS,是OceanBase官方推出的数据迁移工具,能够满足众多数据迁移场景的需求,现已成为众多用户进行数据迁移同步的重要工具。OMS不仅支持多种数据源,还具备全量迁移、增量同步、数据校验等功能,并能够对分表进行聚合操作&…...
golang循环变量捕获问题
在 Go 语言中,当在循环中启动协程(goroutine)时,如果在协程闭包中直接引用循环变量,可能会遇到一个常见的陷阱 - 循环变量捕获问题。让我详细解释一下: 问题背景 看这个代码片段: fo…...
CentOS下的分布式内存计算Spark环境部署
一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架,相比 MapReduce 具有以下核心优势: 内存计算:数据可常驻内存,迭代计算性能提升 10-100 倍(文档段落:3-79…...
拉力测试cuda pytorch 把 4070显卡拉满
import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试,通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小,增大可提高计算复杂度duration: 测试持续时间(秒&…...
【学习笔记】深入理解Java虚拟机学习笔记——第4章 虚拟机性能监控,故障处理工具
第2章 虚拟机性能监控,故障处理工具 4.1 概述 略 4.2 基础故障处理工具 4.2.1 jps:虚拟机进程状况工具 命令:jps [options] [hostid] 功能:本地虚拟机进程显示进程ID(与ps相同),可同时显示主类&#x…...
ABAP设计模式之---“简单设计原则(Simple Design)”
“Simple Design”(简单设计)是软件开发中的一个重要理念,倡导以最简单的方式实现软件功能,以确保代码清晰易懂、易维护,并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计,遵循“让事情保…...
Linux离线(zip方式)安装docker
目录 基础信息操作系统信息docker信息 安装实例安装步骤示例 遇到的问题问题1:修改默认工作路径启动失败问题2 找不到对应组 基础信息 操作系统信息 OS版本:CentOS 7 64位 内核版本:3.10.0 相关命令: uname -rcat /etc/os-rele…...
动态 Web 开发技术入门篇
一、HTTP 协议核心 1.1 HTTP 基础 协议全称 :HyperText Transfer Protocol(超文本传输协议) 默认端口 :HTTP 使用 80 端口,HTTPS 使用 443 端口。 请求方法 : GET :用于获取资源,…...
Caliper 配置文件解析:fisco-bcos.json
config.yaml 文件 config.yaml 是 Caliper 的主配置文件,通常包含以下内容: test:name: fisco-bcos-test # 测试名称description: Performance test of FISCO-BCOS # 测试描述workers:type: local # 工作进程类型number: 5 # 工作进程数量monitor:type: - docker- pro…...
Spring Security 认证流程——补充
一、认证流程概述 Spring Security 的认证流程基于 过滤器链(Filter Chain),核心组件包括 UsernamePasswordAuthenticationFilter、AuthenticationManager、UserDetailsService 等。整个流程可分为以下步骤: 用户提交登录请求拦…...
【WebSocket】SpringBoot项目中使用WebSocket
1. 导入坐标 如果springboot父工程没有加入websocket的起步依赖,添加它的坐标的时候需要带上版本号。 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId> </dep…...
