当前位置: 首页 > news >正文

C++11常用新特性——可变参数模板

可变参数模板

C++11中,可变参数模板是一个非常强大的特性,它允许函数和类模板接受任意数量和类型的参数,这为类型的安全编程提供了更广泛的灵活性。下面我将详细介绍这一新特性。

  • 基础概念

可变参数模板允许你传递多个类型和数量不定的参数给一个函数或类。在之前的C++版本,你需要创建多个重载版本或者诸如va_list这样的C风格技术来处理不定数量的参数,这些方法通常类型不安全且难以管理。

可变参数模板使用一个名为"parameter pack"的概念来表示任意数量的参数。有两种parameter packs:模板参数包(表示零个或多个模板参数)和函数参数包(表示零个或多个函数参数)。

  • 语法

在模板定义中,你可以使用省略号...来指定parameter pack。这告诉编译器你打算接受一个不定数量的参数。

例如,一个简单的可变参数函数模板可能看起来像这样:

template<typename... Args>
void myFunction(Args... args) {// 函数体
}
  • 参数包的展开

有时,你需要在函数中逐一处理参数包中的每个参数。这称为参数包的展开。C++中没有直接展开参数包的内建方式,但你可以通过递归模板函数或基于逗号表达式的技巧来实现。

一种常见的技巧是使用递归,基本的递归展开可能如下所示:

// 递归终止函数
void print() {}template<typename T, typename... Args>
void print(T firstArg, Args... args) {cout << firstArg << endl;  // 处理第一个参数print(args...);  // 递归调用,处理剩余的参数
}
  • 实用案例:

可变参数模板的一个常见用途是构建灵活的元组或类似元组的结构。例如,标准库中的tuple就是使用可变参数模板实现的。

另外,它们在编写需要大量重载的函数(如格式化、构造函数等)时也非常有用,因为你可以用一个函数或构造函数来处理多种情况。

下面是一个完整示例:

#include <iostream>
using namespace std;// 递归终止函数,用于没有任何参数的情况,并打印一个消息。
void handlePrint() {cout << "递归终止,没有更多参数。" << endl;
}// 可变参数模板函数,用于处理多个参数。
template<typename T, typename... Args>
void handlePrint(T firstArg, Args... remainingArgs) {cout << "Argument: " << firstArg;// 如果还有更多参数要处理,显示还剩下多少个if constexpr (sizeof...(remainingArgs) > 0) {cout << " (" << sizeof...(remainingArgs) << " more to go)";}cout << endl;// 判断是否还有其他参数需要递归处理if constexpr (sizeof...(remainingArgs) > 0) {handlePrint(remainingArgs...);  // 递归调用,传递剩余参数} else {handlePrint();  // 没有更多参数,调用无参数的版本来显示递归终止消息}
}int main() {cout << "Starting argument print:" << endl;// 使用不同数量的参数调用函数handlePrint(1, "string", 3.14, 'c');cout << "Completed argument print." << endl;return 0;
}

相关文章:

C++11常用新特性——可变参数模板

可变参数模板 C11中&#xff0c;可变参数模板是一个非常强大的特性&#xff0c;它允许函数和类模板接受任意数量和类型的参数&#xff0c;这为类型的安全编程提供了更广泛的灵活性。下面我将详细介绍这一新特性。 基础概念&#xff1a; 可变参数模板允许你传递多个类型和数量…...

SpringCloud-Seata

一、介绍 &#xff08;1&#xff09;实现分布式事务 &#xff08;2&#xff09;解决Spring只支持单机事务 &#xff08;3&#xff09;事务ID TC&#xff08;事务协调者&#xff09; TM&#xff08;事务管理者&#xff09; RM&#xff08;资源管理者&#xff09;...

java击球小游戏运行代码

创建一个图形化的小游戏通常需要使用Java图形库&#xff0c;例如Swing或JavaFX。下面是一个使用JavaFX创建的简单的图形化小游戏示例&#xff0c;其中一个小球会在窗口内移动&#xff0c;你需要点击小球以增加得分&#xff1a; import javafx.application.Application; import…...

Hadoop面试题+详解

20道面试题及详细解答&#xff01; 1.说说什么是结构化数据、非结构化数据和半结构化数据 结构化数据、非结构化数据和半结构化数据是根据数据的组织结构和格式来划分的不同类型的数据。 结构化数据&#xff1a;结构化数据是按照预定义的数据模型进行组织和存储的数据。它通常…...

PDF编辑阅读:Acrobat Pro DC 2021中文稳定版

Acrobat Pro DC 2021是一款专业的PDF编辑和阅读软件。它可以创建、编辑、组合、签署和分享PDF文件&#xff0c;提供了许多强大的功能&#xff0c;如PDF文件转换、OCR识别、PDF文件合并、加密和解密等等。Acrobat Pro DC 2021的界面简单直观&#xff0c;易于使用&#xff0c;而且…...

单词规律(C++解法)

题目 给定一种规律 pattern 和一个字符串 s &#xff0c;判断 s 是否遵循相同的规律。 这里的 遵循 指完全匹配&#xff0c;例如&#xff0c; pattern 里的每个字母和字符串 s 中的每个非空单词之间存在着双向连接的对应规律。 示例1: 输入: pattern "abba", s …...

MySQL 主从复制原理

文章目录 1.主从复制方式1.1 异步复制1.2 半同步复制1.3 全同步复制 2.主从复制原理3.主从复制时推还是拉&#xff1f;参考文献 主从复制是 MySQL 高可用&#xff08;备份&#xff09;和高性能&#xff08;读写分离&#xff09;的基础&#xff0c;有了这个基础&#xff0c;MySQ…...

构建嵌入式Linux rootfs根文件系统

创建根文件系统涉及选择系统运行所需的文件。在本节中&#xff0c;我们将介绍如何构建压缩的根文件系统。不太常见的选择是在直接作为 root 挂载的本地驱动器上构建未压缩的文件系统。 转载请注明来源&#xff0c;谢谢。构建嵌入式Linux rootfs根文件系统-CSDN博客创建根文件系…...

高速电路设计----第三章

一、数字信号需要上拉的情况 1、 一般信号上拉接多大的电阻要看对于芯片的电流要求。看芯片datasheet的I(BHLO)和I&#xff08;BHHO&#xff09;两个参数。平时的话: 3.3V的上拉为1K~3.3k即可 5V的上拉电阻为4.7K到10K即可。 2、数字信号的逻辑控制&a…...

【微信小程序】6天精准入门(第4天:自定义组件及案例界面)附源码

一、自定义组件 1、介绍 从小程序基础库版本 1.6.3 开始&#xff0c;小程序支持简洁的组件化编程。所有自定义组件相关特性都需要基础库版本 1.6.3 或更高。 开发者可以将页面内的功能模块抽象成自定义组件&#xff0c;以便在不同的页面中重复使用&#xff1b;也可以将复杂的页…...

pragma once与ifndef的区别

概要 代码编译过程中&#xff0c;为了防止同一份代码被重复引用&#xff0c;通常有两种实现方式 方式一 #pragma once 方式二 #ifndef _TEST_H_ #define _TEST_H_ #endif // !TEST_H 通常情况下&#xff0c;使用上述两种方式中的任意一种都是可以的。最近工作中&#xff0c;代…...

52单片机独立键盘控制数码管计数

前言 使用52单片机实现独立键盘控制数码管计数 代码 #include<reg52.h> #define uchar unsigned char #define uint unsigned intsbit key2 P3^4; sbit key3 P3^5; sbit key4 P3^6; sbit key5 P3^7;char code smg[] {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x…...

完美解决 在将最终稿件上传到 IEEE PDF eXpress进行格式检查是出现“font not embedded“的问题 (不会出现自动压缩图像的现象)

最近中了一篇IEEE的论文&#xff0c;在校稿阶段&#xff0c;final paper是需要通过IEEE PDF eXpress网站的格式检查&#xff0c;然后出现一下问题&#xff1a; Errors: Font TimesNewRomanPS-BoldMT, TimesNewRomanPS-ItalicMT, TimesNewRomanPSMT is not embedded 用人话说就…...

零基础学习CSS

01-CSS初体验 层叠样式表 (Cascading Style Sheets&#xff0c;缩写为 CSS&#xff09;&#xff0c;是一种 样式表 语言&#xff0c;用来描述 HTML 文档的呈现&#xff08;美化内容&#xff09;。 书写位置&#xff1a;title 标签下方添加 style 双标签&#xff0c;style 标签…...

基于Flume+Kafka+Hbase+Flink+FineBI的实时综合案例(五)FineBI可视化

文章目录 22&#xff1a;FineBI配置数据集23&#xff1a;FineBI构建报表24&#xff1a;FineBI实时配置测试附录二&#xff1a;离线消费者完整代码 22&#xff1a;FineBI配置数据集 目标&#xff1a;实现FineBI访问MySQL结果数据集的配置 实施 安装FineBI 参考《FineBI Windows…...

Python逆向爬虫案例: 某网站AES逆向解密

前言 嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 环境使用: Python 3.8 Pycharm &#x1f447; &#x1f447; &#x1f447; 更多精彩机密、教程&#xff0c;尽在下方&#xff0c;赶紧点击了解吧~ python源码、视频教程、插件安装教程、资料我都准备好了&#xff0…...

ONNX runtime本地终端部署

1、class_index.csv文件&#xff1a; ID,English,Chinese 0,A,你 1,B,我 2,C,他 3,D,她2、classification.onnx 3、单张图像处理代码如下&#xff1a; import onnxruntime import torch import torch.nn.functional as F import pandas as pd from PIL import Image from tor…...

Linux性能优化--性能工具:特定进程CPU

4.0 概述 在用系统级性能工具找出是哪个进程降低了系统速度之后&#xff0c;你需要用特定进程性能工具来发现这个进程的行为。对此&#xff0c;Linux提供了丰富的工具用于追踪一个进程和应用程序性能的重要统计信息。 阅读本章后&#xff0c;你将能够&#xff1a; 确定应用程…...

技术人员转岗产品经理,有优势吗?

产品经理是一个非技术型的岗位&#xff0c;但是懂一些技术相关的知识会更好的和技术部门沟通&#xff0c;能更好的从技术部门的角度理解需求的可行性。所以这么说来&#xff0c;技术转产品经理相对来说更加有优势。 任何事情不可能都是只有好处没有坏处的&#xff0c;同样的&a…...

使用IDEA2022.1创建Maven工程出现卡死问题

使用IDEA创建Maven工程出现卡死问题&#xff0c;这个是一个bug 这里是别人和官方提供这个bug,大家可以参考一下 话不多说&#xff0c;上教程 解决方案&#xff1a; 方案1&#xff1a;更新idea版本 方案2&#xff1a;关闭工程&#xff0c;再新建&#xff0c;看图...

【磁盘】每天掌握一个Linux命令 - iostat

目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat&#xff08;I/O Statistics&#xff09;是Linux系统下用于监视系统输入输出设备和CPU使…...

[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?

论文网址&#xff1a;pdf 英文是纯手打的&#xff01;论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误&#xff0c;若有发现欢迎评论指正&#xff01;文章偏向于笔记&#xff0c;谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...

使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装

以下是基于 vant-ui&#xff08;适配 Vue2 版本 &#xff09;实现截图中照片上传预览、删除功能&#xff0c;并封装成可复用组件的完整代码&#xff0c;包含样式和逻辑实现&#xff0c;可直接在 Vue2 项目中使用&#xff1a; 1. 封装的图片上传组件 ImageUploader.vue <te…...

[Java恶补day16] 238.除自身以外数组的乘积

给你一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法&#xff0c;且在 O(n) 时间复杂度…...

iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈

在日常iOS开发过程中&#xff0c;性能问题往往是最令人头疼的一类Bug。尤其是在App上线前的压测阶段或是处理用户反馈的高发期&#xff0c;开发者往往需要面对卡顿、崩溃、能耗异常、日志混乱等一系列问题。这些问题表面上看似偶发&#xff0c;但背后往往隐藏着系统资源调度不当…...

【Linux】Linux 系统默认的目录及作用说明

博主介绍&#xff1a;✌全网粉丝23W&#xff0c;CSDN博客专家、Java领域优质创作者&#xff0c;掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围&#xff1a;SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物…...

【Linux】Linux安装并配置RabbitMQ

目录 1. 安装 Erlang 2. 安装 RabbitMQ 2.1.添加 RabbitMQ 仓库 2.2.安装 RabbitMQ 3.配置 3.1.启动和管理服务 4. 访问管理界面 5.安装问题 6.修改密码 7.修改端口 7.1.找到文件 7.2.修改文件 1. 安装 Erlang 由于 RabbitMQ 是用 Erlang 编写的&#xff0c;需要先安…...

java高级——高阶函数、如何定义一个函数式接口类似stream流的filter

java高级——高阶函数、stream流 前情提要文章介绍一、函数伊始1.1 合格的函数1.2 有形的函数2. 函数对象2.1 函数对象——行为参数化2.2 函数对象——延迟执行 二、 函数编程语法1. 函数对象表现形式1.1 Lambda表达式1.2 方法引用&#xff08;Math::max&#xff09; 2 函数接口…...

车载诊断架构 --- ZEVonUDS(J1979-3)简介第一篇

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 做到欲望极简,了解自己的真实欲望,不受外在潮流的影响,不盲从,不跟风。把自己的精力全部用在自己。一是去掉多余,凡事找规律,基础是诚信;二是…...

echarts使用graphic强行给图增加一个边框(边框根据自己的图形大小设置)- 适用于无法使用dom的样式

pdf-lib https://blog.csdn.net/Shi_haoliu/article/details/148157624?spm1001.2014.3001.5501 为了完成在pdf中导出echarts图&#xff0c;如果边框加在dom上面&#xff0c;pdf-lib导出svg的时候并不会导出边框&#xff0c;所以只能在echarts图上面加边框 grid的边框是在图里…...