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

【C++学习笔记】C++多值返回写法

C++不像python可以轻易地处理多值返回问题,处理使用指针或者引用将需要返回的值通过参数带出来,还有几种特殊的方式。
引用自:https://mp.weixin.qq.com/s/VEvUxpcJPsxT9kL7-zLTxg

1. Tuple+ tie

通过使用std::tie,我们可以将tuple中的元素解包到不同的变量中。
std::tie 通常用于创建元组或者用于解构元组。主要用途有两个:将多个变量绑定到一个元组,或者从元组中解构多个值。

将多个变量绑定到一个元组

#include <tuple>
#include <iostream>int main() {int a = 1;double b = 2.5;char c = 'A';// 使用 std::tie 将多个变量绑定到一个元组auto myTuple = std::tie(a, b, c);// 修改变量的值,元组中的值也会相应修改a = 10;b = 20.5;c = 'Z';// 打印元组的值std::cout << "Tuple values: " << std::get<0>(myTuple) << ", " << std::get<1>(myTuple) << ", " << std::get<2>(myTuple) << std::endl;return 0;
}

从元组中解构多个值

#include <tuple>
#include <iostream>int main() {std::tuple<int, double, std::string> myTuple = std::make_tuple(42, 3.14, "Hello");int x;double y;std::string z;// 使用 std::tie 从元组中解构多个值std::tie(x, y, z) = myTuple;// 打印解构出的值std::cout << "x: " << x << ", y: " << y << ", z: " << z << std::endl;return 0;
}

std::tie 提供了一种简洁的方式来处理元组或多个变量的结合,使得代码更易读和维护。

处理多值返回

std::tuple<int, int> divide(int dividend, int divisor) {return std::make_tuple(dividend / divisor, dividend % divisor);
}std::tie(quotient, remainder) = divide(14, 3);
std::cout << quotient << ", " << remainder << std::endl;

Struct Binding 结构体绑定

C++17引入了结构体绑定,可以方便地从结构体、数组、元组等数据结构中将其中的成员变量绑定到命名的变量上,常与auto一起使用

结构体绑定的含义

#include <iostream>
#include <tuple>struct Point {int x;int y;
};int main() {// demo1Point p = {10, 20};// 使用结构化绑定从结构体中解构成员,你可以直接使用 x 和 y 访问结构体的成员,而不需要使用 p.x 和 p.y。    auto [x, y] = p;// demo2std::tuple<int, double, std::string> myTuple = {42, 3.14, "Hello"};// 使用结构化绑定从元组中解构成员auto [x, y, z] = myTuple;
}

结构体绑定解决多值返回

auto divide(int dividend, int divisor) {struct result {int quotient;int remainder;};return result{dividend / divisor, dividend % divisor};
}
auto [quotient, remainder] = divide(14, 3);

函数callback

通过传递处理返回值的callback,让用户自定义处理,这样便实现了返回多个值,实现更加灵活的代码结构。

void divide(int dividend, int divisor, std::function<void(int, int)> callback) {callback(dividend / divisor, dividend % divisor);
}

模版推导

这个有点复杂,GPT解释如下:

//这里定义了一个模板结构体 many,它有两模板参数 T1 和 T2,并包含两个成员变量 quotient 和 remainder 分别是类型 T1 和 T2。
template <typename T1, typename T2>
struct many {T1 quotient;T2 remainder;
};
//这是 C++17 中的类模板参数推导的语法。这行代码告诉编译器如何根据构造函数的参数类型推导出模板参数。它的意思是,当你提供 T1 和 T2 类型的构造函数参数时,编译器应该推导出 many<T1, T2> 类型。
template <class T1, class T2>
many(T1, T2) -> many<T1, T2>;
//这里使用了结构化绑定(structured binding)和自动类型推导(auto),将 divide 函数返回的 many 结构体对象的 quotient 和 remainder 成员分别赋值给变量 quotient 和 remainder。在这里,编译器会根据 many 模板的构造函数推导出正确的类型,即 many<int, int>
auto [quotient, remainder] = divide(14, 3);

模版推导处理多值返回

template <typename T1, typename T2>
struct many {T1 quotient;T2 remainder;
};template <class T1, class T2>
many(T1, T2) -> many<T1, T2>;many<int, int> divide(int dividend, int divisor) {return many{dividend / divisor,dividend % divisor,};
}auto [quotient, remainder] = divide(14, 3);

相关文章:

【C++学习笔记】C++多值返回写法

C不像python可以轻易地处理多值返回问题&#xff0c;处理使用指针或者引用将需要返回的值通过参数带出来&#xff0c;还有几种特殊的方式。 引用自&#xff1a;https://mp.weixin.qq.com/s/VEvUxpcJPsxT9kL7-zLTxg 1. Tuple tie 通过使用std::tie&#xff0c;我们可以将tuple…...

读取带有梯度的张量的具体的值

问题&#xff1a;存在一个带有梯度的张量tensor_example&#xff0c;怎么读取它具体的值 方法&#xff1a;可以使用 .detach().cpu().numpy() 的组合。这样可以在保留值的同时&#xff0c;将张量从计算图中分离&#xff08;detach&#xff09;并移动到 CPU 上。 示例&#xf…...

【分布式微服务专题】SpringSecurity快速入门

目录 前言阅读对象阅读导航前置知识笔记正文一、Spring Security介绍1.1 什么是Spring Security1.2 它是干什么的1.3 Spring Security和Shiro比较 二、快速开始2.1 用户认证2.1.1 设置用户名2.1.1.1 基于application.yml配置文件2.1.1.2 基于Java Config配置方式 2.1.2 设置加密…...

EasyRecovery2024永久免费版电脑数据恢复软件

EasyRecovery是一款操作安全、价格便宜、用户自主操作的非破坏性的只读应用程序&#xff0c;它不会往源驱上写任何东西&#xff0c;也不会对源驱做任何改变。它支持从各种各样的存储介质恢复删除或者丢失的文件&#xff0c;其支持的媒体介质包括&#xff1a;硬盘驱动器、光驱、…...

iphone 苹果 IOS 越狱详细图文保姆级教程非常简单

现在随着各个工具的升级&#xff0c;越狱的难度也是越来越低&#xff0c;还记得 iphone 4 的时候我越狱还是花钱请别人搞得&#xff0c;现在只要你的机型支持越狱&#xff0c;下个工具点一点就可以了&#xff0c;非常简单 目前来说整个越狱过程中&#xff0c;寻找合适机型是最…...

华为HarmonyOS 创建第一个鸿蒙应用 运行Hello World

使用DevEco Studio创建第一个项目 Hello World 1.创建项目 创建第一个项目&#xff0c;命名为HelloWorld&#xff0c;点击Finish 选择Empty Ability模板&#xff0c;点击Next Hello World 项目已经成功创建&#xff0c;接来下看看效果 2.预览 Hello World 点击右侧的预…...

[C#]Onnxruntime部署Chinese CLIP实现以文搜图以文找图功能

【官方框架地址】 https://github.com/OFA-Sys/Chinese-CLIP 【算法介绍】 在当今的大数据时代&#xff0c;文本信息处理已经成为了计算机科学领域的核心议题之一。为了高效地处理海量的文本数据&#xff0c;自然语言处理&#xff08;NLP&#xff09;技术应运而生。而在诸多N…...

openssl ans1定义的实体

由于openssl中的ASN1的结构是通过宏来定义的&#xff0c;导致我们经常找不到他的结构在哪里&#xff0c;通过阅读rfc&#xff0c;并且对照OPENSSL&#xff0c;发现OPENSSL中的结构基本是按照相关rfc中的名称&#xff0c;在openssl中进行搜索&#xff0c;就能找到具体的定义了。…...

【Linux Shell】4. 数组

文章目录 【 1. 数组的定义 】【 2. 读取数组 】【 3. 关联数组 】3.1 关联数组的定义3.2 关联数组元素的调用 【 4. 获取数组中的所有元素 】【 5. 获取数组的长度 】 数组中可以存放多个值。 Bash Shell 只支持一维数组&#xff08;不支持多维数组&#xff09;&#xff0c;初…...

蓝牙运动耳机哪款好用?运动用什么耳机比较好?2024运动耳机推荐

​在众多的耳机类型中&#xff0c;运动耳机因其独特的设计和功能而备受青睐。它们不仅要具备出色的音质&#xff0c;还需要能够适应激烈的运动环境&#xff0c;如防水、防汗、牢固耐用等。今天&#xff0c;我想向大家推荐一些在这些方面表现出色的运动耳机&#xff0c;这些耳机…...

XD6500S一款串口SiP模块 射频LoRa芯片 内置sx1262

1.1产品介绍 XD6500S是一款集射频前端和LoRa射频于一体的LoRa SIP模块系列收发器SX1262 senies&#xff0c;支持LoRa⑧和FSK调制。LoRa技术是一种扩频协议优化低数据速率&#xff0c;超长距离和超低功耗用于LPWAN应用的通信。 XD6500S设计具有4.2 mA的有效接收电流消耗&#…...

【华为OD机试真题2023CD卷 JAVAJS】测试用例执行计划

华为OD2023(C&D卷)机试题库全覆盖,刷题指南点这里 测试用例执行计划 时间限制:1s 空间限制:256MB 限定语言:不限 题目描述: 某个产品当前迭代周期内有N个特性()需要进行覆盖测试,每个特性都被评估了对应的优先级,特性使用其ID作为下标进行标识。 设计了M个测试用…...

猫长期吃猫粮好吗?主食冻干猫粮那种好吃又健康

许多铲屎官可能认为&#xff0c;只需给猫咪喂食猫粮就足够了。然而&#xff0c;猫咪实际上是肉食动物&#xff0c;对蛋白质的需求非常高。冻干猫粮采用低温真空干燥处理技术&#xff0c;将鲜肉经过预冻、升华、解析三个过程&#xff0c;去除水分的同时保持蛋白质等营养物质不变…...

计算机毕业设计-----ssm停车位租赁系统

项目介绍 该系统采用了经典的springmvc&#xff0c;spring&#xff0c;mybatis的框架组合&#xff0c;对于物业公司来说&#xff0c;有助于管理车位信息。系统分为了两个角色&#xff1a;车主和租客。 车主主要功能包括&#xff1a; 停车位信息 停车位列表 添加停车位 租赁合…...

Git保姆级安装教程

Git保姆级安装教程 一、去哪下载二、安装2.1 具体安装步骤2.2 设置全局用户签名 一、去哪下载 1、官网&#xff08;有最新版本&#xff09;&#xff1a;https://git-for-windows.github.io/ 2、本人学习时安装的版本&#xff0c;链接&#xff1a;https://pan.baidu.com/s/1uAo…...

听GPT 讲Rust源代码--compiler(34)

File: rust/compiler/rustc_middle/src/ty/print/mod.rs 在Rust源代码中&#xff0c;文件rust/compiler/rustc_middle/src/ty/print/mod.rs的作用是定义了打印类型和其他相关信息的功能。 具体来说&#xff0c;该文件中定义了三个trait&#xff0c;分别为Print<tcx>、Pri…...

视频融合云平台/智慧监控平台EassyCVR告警警告出错是什么原因?该如何解决?

视频集中存储/云存储/视频监控管理平台EasyCVR能在复杂的网络环境中&#xff0c;将分散的各类视频资源进行统一汇聚、整合、集中管理&#xff0c;实现视频资源的鉴权管理、按需调阅、全网分发、智能分析等。AI智能/大数据视频分析EasyCVR平台已经广泛应用在工地、工厂、园区、楼…...

Gin 路由注册与请求参数获取

Gin 路由注册与请求参数获取 文章目录 Gin 路由注册与请求参数获取一、Web应用开发的两种模式1.前后端不分离模式2.前后端分离模式 二、RESTful介绍三、API接口3.1 RESTful API设计指南3.2 API与用户的通信协议3.3 RestFul API接口设计规范3.3.1 api接口3.3.2 接口文档&#xf…...

Linux第11步_解决“挂载后的U盘出现中文乱码”

学习完“通过终端挂载和卸载U盘”&#xff0c;我们发现U盘下的中文文件名会出现乱码&#xff0c;现在讲解怎么解决这个问题。其实就是复习一下“通过终端挂载和卸载U盘”&#xff0c;单独讲解&#xff0c;是为了解决问题&#xff0c;一次性搞好&#xff0c;我们会不长记性。 在…...

【第一节】安装java jdk 21

在 Java Downloads | Oracle 中国 网站下载jdk21的包 查看jdk 命令 /usr/libexec/java_home -V 设置环境变量 配置环境变量 在~/.bash_profile文件里面加入以下环境变量 export JAVA_HOME/Library/Java/JavaVirtualMachines/jdk-21.jdk/Contents/Home export PATH$PATH:$J…...

[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?

&#x1f9e0; 智能合约中的数据是如何在区块链中保持一致的&#xff1f; 为什么所有区块链节点都能得出相同结果&#xff1f;合约调用这么复杂&#xff0c;状态真能保持一致吗&#xff1f;本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里&#xf…...

MongoDB学习和应用(高效的非关系型数据库)

一丶 MongoDB简介 对于社交类软件的功能&#xff0c;我们需要对它的功能特点进行分析&#xff1a; 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具&#xff1a; mysql&#xff1a;关系型数据库&am…...

循环冗余码校验CRC码 算法步骤+详细实例计算

通信过程&#xff1a;&#xff08;白话解释&#xff09; 我们将原始待发送的消息称为 M M M&#xff0c;依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)&#xff08;意思就是 G &#xff08; x ) G&#xff08;x) G&#xff08;x) 是已知的&#xff09;&#xff0…...

【论文阅读28】-CNN-BiLSTM-Attention-(2024)

本文把滑坡位移序列拆开、筛优质因子&#xff0c;再用 CNN-BiLSTM-Attention 来动态预测每个子序列&#xff0c;最后重构出总位移&#xff0c;预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵&#xff08;S…...

关键领域软件测试的突围之路:如何破解安全与效率的平衡难题

在数字化浪潮席卷全球的今天&#xff0c;软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件&#xff0c;这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下&#xff0c;实现高效测试与快速迭代&#xff1f;这一命题正考验着…...

让回归模型不再被异常值“带跑偏“,MSE和Cauchy损失函数在噪声数据环境下的实战对比

在机器学习的回归分析中&#xff0c;损失函数的选择对模型性能具有决定性影响。均方误差&#xff08;MSE&#xff09;作为经典的损失函数&#xff0c;在处理干净数据时表现优异&#xff0c;但在面对包含异常值的噪声数据时&#xff0c;其对大误差的二次惩罚机制往往导致模型参数…...

招商蛇口 | 执笔CID,启幕低密生活新境

作为中国城市生长的力量&#xff0c;招商蛇口以“美好生活承载者”为使命&#xff0c;深耕全球111座城市&#xff0c;以央企担当匠造时代理想人居。从深圳湾的开拓基因到西安高新CID的战略落子&#xff0c;招商蛇口始终与城市发展同频共振&#xff0c;以建筑诠释对土地与生活的…...

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

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

宇树科技,改名了!

提到国内具身智能和机器人领域的代表企业&#xff0c;那宇树科技&#xff08;Unitree&#xff09;必须名列其榜。 最近&#xff0c;宇树科技的一项新变动消息在业界引发了不少关注和讨论&#xff0c;即&#xff1a; 宇树向其合作伙伴发布了一封公司名称变更函称&#xff0c;因…...

LRU 缓存机制详解与实现(Java版) + 力扣解决

&#x1f4cc; LRU 缓存机制详解与实现&#xff08;Java版&#xff09; 一、&#x1f4d6; 问题背景 在日常开发中&#xff0c;我们经常会使用 缓存&#xff08;Cache&#xff09; 来提升性能。但由于内存有限&#xff0c;缓存不可能无限增长&#xff0c;于是需要策略决定&am…...