【C++】变长参数

news2025/1/16 17:06:02

文章目录

  • 1. 定义:
  • 2. C++代码示例:
    • 2.1 实现方式一:
    • 2.2 实现方式二:
    • 2.3 实现方式三:
  • 3. 总结
    • 3.1 使用...语法:
    • 3.2 使用 std::initializer_list
    • 3.3 使用变长模板参数(Variadic Templates)

1. 定义:

  • 变长参数: 是指在函数定义时,函数的参数个数不固定,可以接受任意数量的参数。变长参数通常用于不确定传入多少参数的情况

2. C++代码示例:

2.1 实现方式一:

使用头文件 <cstdarg> 中的va_listva_startva_argva_end

#include <iostream>
#include <cstdarg>

void printNumber(int count, ...){
    va_list args;   // 用于遍历参数列表
    va_start(args, count);  // 初始化args,指定第一个可变参数的前一个参数

    for(int i=0; i< count; i++){
        int num = va_arg(args, int);  // 获取下一个参数
        printf("%d\n", num);
    }
    // 清理
    va_end(args);
}

int main(){
    printNumber(3, 1, 2, 3);
    return 0;
}

代码输出:

1
2
3

代码解析:

  • va_list args:声明一个类型为 va_list 的变量 args,它用于访问变长参数
  • va_start(args, count) :初始化 args
  • va_arg(args, int) :每次调用 va_arg 获取下一个可变参数,指定参数类型为 int
  • va_end(args) :结束参数的遍历

2.2 实现方式二:

使用C++17的变长模板参数(Variadic Templates)

#include <iostream>

template<typename... Args>
void printNumber(Args... args){
     ((std::cout << args << " "), ...); 
     std::cout<< std::endl;
}

int main(){
    printNumber(4, 5, 2, 3);
    return 0;
}

代码输出:

4 5 2 3

代码解释:

  • template <typename... Args>:这是一个模板函数,可以接受任意数量的参数
  • ((std::cout << args << " "), ...):这是一种 C++17 引入的“折叠表达式”,它会展开 args… 并依次打印每个参数。
  • 在进行编译的时候要加上 -std=c++17 或者 -std=gnu++17

2.3 实现方式三:

使用C++11的std::initializer_list

#include <iostream>

void printNumber(std::initializer_list<int> list){
    for(auto num : list){
        std::cout<< num << " ";
    }
    std::cout << std::endl;
}

int main(){
    printNumber({4,2,3,1});
    return 0;
}

代码输出:

4 2 3 1

代码解释:

  • std::initializer_list<int> list:initializer_list 是一个 C++11 引入的类模板,它提供了对初始化列表中元素的访问
  • 通过 {} 语法,可以将多个值传递给 printNumbers 函数

3. 总结

3.1 使用…语法:

优点:

  • 灵活性高,函数可以接受任意数量的参数,许多老旧的库使用这样的方式(例如printf

缺点:

  • 类型安全差:编译器无法检查参数类型,容易发生类型不匹配的错误。
  • 可读性差:调用者必须显式地传递参数的数量(通常第一个参数是元素个数),否则无法知道有多少参数。
  • 可维护性差:当参数数量较多时,代码的可维护性较差,且较容易出现错误。
  • 性能问题:需要在运行时解析参数列表,性能可能不如其它实现方式。

3.2 使用 std::initializer_list

优点:

  • 类型安全:使用 initializer_list 可以保证类型安全,避免了类型不匹配的问题。
  • 可读性强:调用者可以直接通过大括号初始化参数列表,代码清晰简洁。
  • 易于维护:不需要传递额外的参数(如元素个数),函数会自动处理所有传入的元素。

缺点:

  • 不适用于大规模变长参数:initializer_list 适用于小规模参数的场景。如果需要传递大量的参数,initializer_list 可能不够灵活。
  • 只能用于可拷贝对象:initializer_list 内部的数据是只读的,并且只能存放拷贝构造和移动构造类型的元素,不能直接处理指针或非常规类型。
  • 不能动态传参:initializer_list 是静态的,调用时必须在编译时确定列表中的元素。

3.3 使用变长模板参数(Variadic Templates)

优点:

  • 类型安全:编译器会检查所有传入参数的类型,避免了类型错误。
  • 灵活性强:支持任意数量和类型的参数,可以很方便地组合和扩展。
  • 性能高:相比于 … 语法和 initializer_list,变长模板参数通常具有更好的性能,因为参数是通过模板推导而来的,并不需要在运行时解析。
  • 易于维护:代码结构清晰,能够很容易地管理多个参数,尤其是与模板元编程结合时。

缺点:

  • 代码复杂:如果不熟悉模板编程,可能会觉得变长模板参数的代码相对复杂,尤其是折叠表达式(C++17引入)。
  • 不支持非类型参数:变长模板参数不能直接处理例如指针、动态数组等一些复杂类型。如果需要处理这些类型,可能需要额外的代码来包装。

在这里插入图片描述

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

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

相关文章

内网穿透 natapp安装与使用

前言 NATAPP是一款基于ngrok的内网穿透工具。以下是对NATAPP的详细概述&#xff1a; 基本概念 定义&#xff1a;内网穿透&#xff08;NAT穿透&#xff09;是一种技术&#xff0c;它允许具有特定源IP地址和端口号的数据包能够绕过NAT设备&#xff0c;从而被正确地路由到内网主机…

TPAMI 2023:When Object Detection Meets Knowledge Distillation: A Survey

摘要 目标检测&#xff08;Object Detection&#xff0c;OD&#xff09;是计算机视觉中的一项关键任务&#xff0c;多年来涌现出了众多算法和模型。尽管当前 OD 模型的性能有所提升&#xff0c;但它们也变得更加复杂&#xff0c;由于参数规模庞大&#xff0c;在工业应用中并不…

怎么样能使Ubuntu的文件浏览器显示当前目录的路径,而不是只显示一个文件名?

默认情况下Ubuntu的文件浏览器是只显示当前目录的目录名的&#xff0c;这很不便我们查看路径或直接利用路径进行定位&#xff0c;那么怎么样能使Ubuntu的文件浏览器显示当前目录的路径呢&#xff1f; 两种方法&#xff1a; 第1种-临时方法 按下快捷键 Ctrl L&#xff0c;导航…

Uniapp Android SpringBoot3 对接支付宝支付(最新教程附源码)

Uniapp Android SpringBoot3 对接支付宝支付&#xff08;最新教程附源码&#xff09; 1、效果展示2、后端实现2.1 引入支付宝SDK依赖 pom.xml2.2 配置 application.yml2.3 支付宝相关代码2.3.1 AlipayConfig.java2.3.2 ZfbPayConfig.java2.3.3 支付接口2.3.4 支付回调处理接口&…

阿里云ECS服务器域名解析

阿里云ECS服务器域名解析&#xff0c;以前添加两条A记录类型&#xff0c;主机记录分别为www和&#xff0c;这2条记录都解析到服务器IP地址。 1.进入阿里云域名控制台&#xff0c;找到域名 ->“解析设置”->“添加记录” 2.添加一条记录类型为A,主机记录为www&#xff0c…

【MySQL】mysql服务器架构

目录 1、背景2、mysql服务器架构解释3、总结 1、背景 简单理解一下mysql的服务器架构。 2、mysql服务器架构解释 mysql的架构图如下&#xff1a; 主要分为三部分&#xff1a;客户端、服务端、存储引擎。接下来我们来解释一下各个部分&#xff1a; 客户端 用来连接mysql服务…

BERT模型的输出格式探究以及提取出BERT 模型的CLS表示,last_hidden_state[:, 0, :]用于提取每个句子的CLS向量表示

说在前面 最近使用自己的数据集对bert-base-uncased进行了二次预训练&#xff0c;只使用了MLM任务&#xff0c;发现在加载训练好的模型进行输出CLS表示用于下游任务时&#xff0c;同一个句子的输出CLS表示都不一样&#xff0c;并且控制台输出以下警告信息。说是没有这些权重。…

基于LSTM的A股股票价格预测系统(torch) :从数据获取到模型训练的完整实现

1. 项目简介 本文介绍了一个使用LSTM&#xff08;长短期记忆网络&#xff09;进行股票价格预测的完整系统。该系统使用Python实现&#xff0c;集成了数据获取、预处理、模型训练和预测等功能。 这个代码使用的是 LSTM (Long Short-Term Memory) 模型&#xff0c;这是一种特殊的…

【ArcGIS微课1000例】0134:ArcGIS Earth实现二维建筑物的三维完美显示

文章目录 一、加载数据二、三维显示三、三维符号化一、加载数据 加载配套实验数据(0134.rar中的建筑物,2d或3d都可以),方法如下:点击添加按钮。 点击【Add Files】,在弹出的Open对话框中,选择建筑物,点击确定,完成添加。 默认二维显示: 二、三维显示 右键建筑物图层…

汽车EEA架构:发展历程

1.发展历程的基本逻辑 汽车电子电气的发展历程中&#xff0c;其使用的基本逻辑是IPO(Input-Processing-Output)模型&#xff0c;如下图1所示&#xff1a; 图 1 那什么是IPO模型了&#xff1f;我们从控制器的原理入手解释IPO模型,控制器的主要用途如下&#xff1a; 根据给定的逻…

python拆分Excel文件

按Sheet拆分Excel 或 按照某一列的不同值拆分Excel。文档样式如下&#xff1a; 结果&#xff1a;红色是按照Sheet名拆出的&#xff0c;蓝色和橙色是某个Sheet按照某列的不同值拆分的。 代码&#xff1a; # -*- coding: utf-8 -*- """ 拆分excel文件——按照…

存内架构IR-DROP问题详解-电容电导补偿

一、总述 电容、电导补偿作为大规模数字电路的关键设计理念&#xff0c;是 CIM 架构优化的核心技术。在 CIM 中&#xff0c;平衡电容或电导并实现计算的精准映射&#xff0c;对能效提升和计算精度保障具有关键作用。本文基于近期文献探讨电容、电导补偿在 CIM 中的具体补偿策…

汽车网络安全 -- IDPS如何帮助OEM保证车辆全生命周期的信息安全

目录 1.强标的另一层解读 2.什么是IDPS 2.1 IDPS技术要点 2.2 车辆IDPS系统示例 3.车辆纵深防御架构 4.小结 1.强标的另一层解读 在最近发布的国家汽车安全强标《GB 44495》,在7.2节明确提出了12条关于通信安全的要求,分别涉及到车辆与车辆制造商云平台通信、车辆与车辆…

【数字化】华为企业数字化转型-认知篇

导读&#xff1a;企业数字化转型的必要性在于&#xff0c;它能够帮助企业适应数字化时代的需求&#xff0c;提升运营效率&#xff0c;创新业务模式&#xff0c;增强客户互动&#xff0c;从而在激烈的市场竞争中保持领先地位并实现可持续发展。通过学习华为企业数字化转型相关理…

用C#开发程序进行ASCII艺术制作

我一直很喜欢 ASCII 艺术&#xff0c;而我对制作 ASCII 艺术的热情促使我探索 .NET 框架中的 GDI。在本文中&#xff0c; 我将向您展示如何通过三个简单的步骤从 JPEG/Bitmap 图像生成 ASCII 艺术。 1、加载并调整图像大小。 2、读取每个像素&#xff0c;获取其颜色并将其转换…

第23周:机器学习及文献阅读

目录 摘要 Abstract 一、理论知识 1、逻辑提升 2、分类任务 3、10倍交叉验证法 二、文献阅读 1、模型方法——MLT &#xff08;1&#xff09;特征选择 &#xff08;2&#xff09;决策树剪枝 2、分类任务——逻辑回归 3、实验部分 数据集的选取 代码实践 模型…

2020年国赛高教杯数学建模E题校园供水系统智能管理解题全过程文档及程序

2020年国赛高教杯数学建模 E题 校园供水系统智能管理 原题再现 校园供水系统是校园公用设施的重要组成部分&#xff0c;学校为了保障校园供水系统的正常运行需要投入大量的人力、物力和财力。随着科学技术的发展&#xff0c;校园内已经普遍使用了智能水表&#xff0c;从而可以…

React开发高级篇 - React Hooks以及自定义Hooks实现思路

Hooks介绍 Hooks是react16.8以后新增的钩子API&#xff1b; 目的&#xff1a;增加代码的可复用性&#xff0c;逻辑性&#xff0c;弥补无状态组件没有生命周期&#xff0c;没有数据管理状态state的缺陷。 为什么要使用Hooks&#xff1f; 开发友好&#xff0c;可扩展性强&#…

摩尔线程 国产显卡 MUSA 并行编程 学习笔记-2024/12/03

Learning Roadmap&#xff1a; Section 1: Intro to Parallel Programming & MUSA Deep Learning Ecosystem&#xff08;摩尔线程 国产显卡 MUSA 并行编程 学习笔记-2024/11/30-CSDN博客&#xff09;UbuntuDriverToolkitcondapytorchtorch_musa环境安装(2024/11/24-Ubunt…

如何使用Docker轻松搭建高颜值无广告音乐播放器SPlayer随时随地听歌

前言 在快节奏的生活环境中&#xff0c;音乐成为了许多人放松和享受的重要方式。本文将介绍如何在Linux Ubuntu系统中使用Docker快速部署一款高颜值无广告的某抑云音乐播放器——SPlayer&#xff0c;并结合Cpolar内网穿透工具实现出门在外也能远程访问本地服务&#xff0c;随时…