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

c++23中的新功能之十五类tuple类型的完全支持

一、std::tuple和std::pair

在传统的C++里一直有一个问题让开发者不爽,就是无法返回多个值。一般来说,返回多个都建议采用封装的模式,比如弄一个结构体或者类啥的。这样做一定时没有问题的,但对于一些只返回一些简单值并且只在偶尔情况下使用的时候儿,封装一个结构体之类的有点用力过猛的意思。
所以在后来出现了std::pair,它其实就是一个类似于封装的一个结体可简化如下:

template<typename T1,typename T2>
struct pair
{T1 first;T2 second;
};

这样一来,就可以在一些需要返回多个值的情况下使用此数据结构。但是这也只是简化了使用而并没有达到其它语言的多值返回,开发者也只能接受。但随着std::tuple的出现,使得std::pair变得有点鸡肋的味道。毕竟这个数据结构虽然说有点方便,但还是有点不方便(比如传三个或者更多的参数)?更让人不好理解的是,泛型的T很难描述first和second的关系,这对于具体到某个公司或者说某个程序来说不算什么大问题,但用在标准库里,可是真得有点问题。
这两个问题的存在,后者在C++20中进行了完善,使用了具名的数据结构体,而前者则是出现了std::tuple。相比std::pair它可以更多的处理异类的参数(当然,同类更没问题),不过它的访问方式相比std::pair有了一些小小的不方便。只能使用类型或索引“std::get(stuTuple) or std::get<0>(stuTuple)”。不过在C++17还提供了聚合初始化访问的方式,类似下面的代码:


auto [a,b,c,d] = getTuple();
std::cout<<a<<b<<c<<d<<std::endl;

它等于是简化了使用std::tie来处理这种情况,这样做的好处就不言而喻了。
为了鼓励开发者从std::pair转到std::tuple(std::tuple的应用还真是不多),STL提供了从pair<T,U>到 tuple<T,U>的隐式转换,但反之则不行。这也算是一种诱导法则吧。

二、类tuple类型及处理

在结构化绑定中,理论上讲,只要成员是公有的,都可以直接进行处理。类似于下面的代码:

struct Data{...};
Data d{...};
auto [a,b,c] = d;

在C++17中提供了一个std::is_aggregate元编程的接口来判断是否一个可聚合初始化的类型。但是对于一些自定义的非聚合类型呢?这块也有办法。这就是本文提到的类tuple的实现,先看代码:

#include <tuple>
class Data {
private:int id;int num;int value;public:Data(int d, int n, int v) : id{d}, num{n}, value{v} {}int getV() const { return value; }int getN() const { return num; }int getID() const { return id; }
};template <> struct std::tuple_size<Data> : std::integral_constant<int, 3> {};
template <> struct std::tuple_element<0, Data> { using type = int; };
template <> struct std::tuple_element<1, Data> { using type = int; };
template <> struct std::tuple_element<2, Data> { using type = int; };template <int i> auto get(const Data &d) {static_assert(0 <= i && i <= 2);if constexpr (i == 0) {return d.getID();} else if (i == 1) {return d.getN();} else {return d.getV();}
}void testTuple() {Data data{3, 6, 9};auto [id, num, v] = data;
}

说明:
要想实现类tuple类型就需要对下面的三个约束条件进行实现:
1、std::tuple_size_v要符合要求(std::integral_constant<std::size_t, value>),返回一个大于0的长度。
2、std::tuple_element_t<i, T>(i与数组定义类似从0~tuple.size-1)符合要求,其类型要与自定义类型相匹配。
3、必须实现tuple.get或get(tuple),并返回tuple的第i个元素值.
此功能在C++17中已经有所体现,到了C++23有着更强有力的支持:
1、任意标准类tuple类型可以转换成std::tuple,同时能进行大小/相等的比较 ;任意长度为2的标准tuple类型和std::pair可互转,并且可以比较大小/相等
2、任意两个标准类tuple类型之间有common_reference和common_type
3、任意标准类tuple类型现在都能成为tuple_cat/apply/make_from_tuple的参数
这样一来,基本上常见的一些问题都可以解决了。

三、注意点

使用std::tuple和类tuple的人不多,应用场景也不多。但是注意点却很多:
1、尽量使用标准类tuple类型(tuple, pair, array, ranges::subrange),否则会有一些可能想不到意外
2、不要想把tuple相关的函数悉数应用在类tuple类型中
3、尽量使用新标准的编译器

四、总结

人们总是希望新标准能解决问题,但没想到的是,往往新的标准又会引入新的问题。这本身就是一个动态循环的问题,已经是一个众人皆知的现象,但人们仍然还是抱有一种希望吧。不过,新的标准会把一些急切的问题解决并引领开发者不断的向着更好的方向发展,这才是标准发展的意义。

相关文章:

c++23中的新功能之十五类tuple类型的完全支持

一、std::tuple和std::pair 在传统的C里一直有一个问题让开发者不爽&#xff0c;就是无法返回多个值。一般来说&#xff0c;返回多个都建议采用封装的模式&#xff0c;比如弄一个结构体或者类啥的。这样做一定时没有问题的&#xff0c;但对于一些只返回一些简单值并且只在偶尔…...

iPhone15线下购买,苹果零售店前门店排长队

今年的苹果新品发布会于北京时间 9 月 13 日凌晨举行&#xff0c;并于 9 月 15 日&#xff08;周五&#xff09;开启订购&#xff0c;9 月 22 日&#xff08;周五&#xff09;起正式发售。 据多位网友反馈&#xff0c;首批苹果 iPhone15 系列手机、Apple Watch Ultra 2 / Seri…...

Vue3如何优雅的加载大量图片?

前端面试题库 &#xff08;面试必备&#xff09; 推荐&#xff1a;★★★★★ 地址&#xff1a;前端面试题库 表妹一键制作自己的五星红旗国庆头像&#xff0c;超好看 最近开发了一个功能&#xff0c;页面首页会加载大量的图片&#xff0c;初次进入页面时&#xff…...

Go语言开发环境搭建指南:快速上手构建高效的Go开发环境

Go 官网&#xff1a;https://go.dev/dl/ Go 语言中文网&#xff1a;https://studygolang.com/dl 下载 Go 的语言包 进入官方网站 Go 官网 或 Go 语言中文网&#xff1a; 选择下载对应操作系统的安装包&#xff1a; 等待下载完成&#xff1a; 安装 Go 的语言包 双击运行上…...

flex布局与float布局

float布局 俩栏 三栏 flex布局...

【C语言】字符函数和字符串函数(含模拟)

前言&#xff1a; 在做OJ题或阅读代码时或多或少会遇到一些字符函数和字符串函数&#xff0c; 如果不认识或不熟悉就会造成不便&#xff0c; 本篇文章主要是为了这方面而存在&#xff0c; 此篇介绍各个字符串的功能与使用方法&#xff0c; 下一篇会讲解如何模拟这些函数 重点&a…...

基于YOLOv8模型的条形码二维码检测系统(PyTorch+Pyside6+YOLOv8模型)

摘要&#xff1a;基于YOLOv8模型的条形码二维码检测系统可用于日常生活中检测与定位条形码与二维码目标&#xff0c;利用深度学习算法可实现图片、视频、摄像头等方式的目标检测&#xff0c;另外本系统还支持图片、视频等格式的结果可视化与结果导出。本系统采用YOLOv8目标检测…...

2023/09/22 制作demo期间心得

A*的估价函数&#xff1a;例如A->C&#xff0c;会计算A到B的距离B到C的距离作为成本&#xff0c;雕刻不会导致全局路线的重新计算&#xff0c;凸多边形是一个内部为凸集的简单多边形。 简单多边形的下列性质与其凸性等价&#xff1a;1、所有内角小于等于180度。 2、任意两个…...

高阶数据结构——图

图 图的基本概念 图的基本概念 图是由顶点集合和边的集合组成的一种数据结构&#xff0c;记作 G ( V , E ) G(V, E)G(V,E) 。 有向图和无向图&#xff1a; 在有向图中&#xff0c;顶点对 < x , y >是有序的&#xff0c;顶点对 < x , y > 称为顶点 x 到顶点 y 的…...

高性能AC算法多关键词匹配文本功能Java实现

直接上测试结果&#xff1a; 1000000数据集。 1000000关键词&#xff08;匹配词&#xff09; 装载消耗时间&#xff1a;20869 毫秒 匹配消耗时间&#xff1a;6599 毫秒 代码和测试案例&#xff1a; package com.baian.tggroupmessagematchkeyword.ac;import lombok.Data;im…...

如何在没有第三方.NET库源码的情况,调试第三库代码?

大家好&#xff0c;我是沙漠尽头的狼。 本方首发于Dotnet9&#xff0c;介绍使用dnSpy调试第三方.NET库源码&#xff0c;行文目录&#xff1a; 安装dnSpy编写示例程序调试示例程序调试.NET库原生方法总结 1. 安装dnSpy dnSpy是一款功能强大的.NET程序反编译工具&#xff0c;…...

仿互站资源商城平台系统源码多款应用模版

首先安装好环境&#xff0c;推荐用Linux宝塔 请示&#xff1a;安装前请先别开防火墙&#xff0c;和跨站篡改 第1步上传程序到服务器&#xff0c; 第2步修改数据库文件&#xff0c;config/config.php 第3步&#xff0c;导入数据&#xff0c;根目录的数据库文件夹里面 数据.s…...

华为云云耀云服务器L实例评测 | L实例性能测试实践

&#x1f996;我是Sam9029&#xff0c;一个前端 Sam9029的CSDN博客主页:Sam9029的博客_CSDN博客-JS学习,CSS学习,Vue-2领域博主 **&#x1f431;‍&#x1f409;&#x1f431;‍&#x1f409;恭喜你&#xff0c;若此文你认为写的不错&#xff0c;不要吝啬你的赞扬&#xff0c;求…...

VR赋能红色教育,让爱国主义精神永放光彩

昨天的918防空警报长鸣&#xff0c;人们默哀&#xff0c;可见爱国主义精神长存。为了贯彻落实“把红色资源利用好、红色传统发扬好、红色基因传承好”的指示精神&#xff0c;许多红色景点开始引入VR全景展示技术&#xff0c;为游客提供全方位720度无死角的景区展示体验。 VR全…...

计算机视觉与深度学习-卷积神经网络-卷积图像去噪边缘提取-图像去噪 [北邮鲁鹏]

目录标题 参考学习链接图像噪声噪声分类椒盐噪声脉冲噪声对椒盐噪声&脉冲噪声去噪使用高斯卷积核中值滤波器 高斯噪声减少高斯噪声 参考学习链接 计算机视觉与深度学习-04-图像去噪&卷积-北邮鲁鹏老师课程笔记 图像噪声 噪声点&#xff0c;其实在视觉上看上去让人感…...

三行代码实现图像画质修复,图片清晰度修复,清晰度提升python

核心代码 # 原始文件 enhancer ImageEnhance.Sharpness(Image.open(文件路径.png)) # 增强图片 img_enhanced enhancer.enhance(增强系数float) # 输出目标文件 img_enhanced.save(文件名.png)注意&#xff0c;输入输出文件格式必须一致 所需依赖 # 文件选择框&#xff0c…...

企业电子招投标采购系统源码之电子招投标的组成

功能模块&#xff1a; 待办消息&#xff0c;招标公告&#xff0c;中标公告&#xff0c;信息发布 描述&#xff1a; 全过程数字化采购管理&#xff0c;打造从供应商管理到采购招投标、采购合同、采购执行的全过程数字化管理。通供应商门户具备内外协同的能力&#xff0c;为外部供…...

【MySQL】 MySQL的增删改查(进阶)--贰

文章目录 &#x1f6eb;新增&#x1f6ec;查询&#x1f334;聚合查询&#x1f6a9;聚合函数&#x1f388;GROUP BY子句&#x1f4cc;HAVING &#x1f38b;联合查询⚾内连接⚽外连接&#x1f9ed;自连接&#x1f3c0;子查询&#x1f3a1;合并查询 &#x1f3a8;MySQL的增删改查(…...

第七章 查找

一、树形查找-二叉排序树和红黑树 二叉排序树 // 二叉排序树节点 typedef struct BSTNode{ElemType key;struct BSTNode *lchild, *rchild; } BSTNode, *BSTree;五叉查找树 // 5叉排序树的节点定义 struct Node{ElemType keys[4]; // 5叉查找树一个节点最多4个关键字struct…...

openfeign返回消息报错.UnknownContentTypeException

1. springcloud项目使用openfeign报错 org.springframework.web.client.UnknownContentTypeException: Could not extract response: no suitable HttpMessageConverter found for response type [com.yl.base.Result<java.util.List<com.yl.entity.LabelConfig>>…...

PixelAnnotationTool终极指南:如何用智能分水岭算法实现高效像素级图像标注

PixelAnnotationTool终极指南&#xff1a;如何用智能分水岭算法实现高效像素级图像标注 【免费下载链接】PixelAnnotationTool Annotate quickly images. 项目地址: https://gitcode.com/gh_mirrors/pi/PixelAnnotationTool 你是否曾经为图像标注工作感到头疼&#xff…...

5分钟快速上手PptxGenJS:用JavaScript轻松生成专业PPT的完整指南

5分钟快速上手PptxGenJS&#xff1a;用JavaScript轻松生成专业PPT的完整指南 【免费下载链接】PptxGenJS Build PowerPoint presentations with JavaScript. Works with Node, React, web browsers, and more. 项目地址: https://gitcode.com/gh_mirrors/pp/PptxGenJS 你…...

第七部分-容器安全与监控——33. 镜像安全

33. 镜像安全 1. 镜像安全概述 镜像是容器的基石&#xff0c;镜像安全问题直接影响容器运行时安全。镜像安全涵盖基础镜像选择、镜像构建过程、镜像存储和分发等环节。 ┌─────────────────────────────────────────────────…...

大模型评测实战指南:从基准测试到技术选型的全流程解析

1. 项目概述&#xff1a;为什么我们需要一个“大模型评测”清单&#xff1f;如果你在过去一年里深度参与过大语言模型&#xff08;LLM&#xff09;的应用开发、技术选型或者仅仅是技术追踪&#xff0c;你大概率会和我有同样的感受&#xff1a;“评测”这件事&#xff0c;变得越…...

保姆级教程:在Windows 10/11上从源码编译Groops(含Qt环境变量避坑指南)

从零构建Groops编译环境&#xff1a;Windows系统下的完整避坑指南 当你在GNSS数据处理领域深耕时&#xff0c;一款强大的开源工具能让你事半功倍。Groops作为重力场恢复和精密定轨的瑞士军刀&#xff0c;其功能强大但编译过程却可能让新手望而却步。本文将带你一步步穿越编译迷…...

从帧结构到数据解析:深入理解CJ/T 188 MBUS水表通信协议

1. MBUS协议与水表通信基础 第一次接触CJ/T 188 MBUS协议时&#xff0c;我完全被那一串串十六进制报文搞懵了。FE FE FE 68开头的报文到底在说什么&#xff1f;为什么水表厂商给的文档读起来像天书&#xff1f;经过几个项目的实战&#xff0c;我发现只要掌握几个关键点&#xf…...

别再照搬Zynq教程了!手把手教你为Arty A7-35T配置MicroBlaze的SPI Flash启动(附时钟连接避坑指南)

别再照搬Zynq教程了&#xff01;手把手教你为Arty A7-35T配置MicroBlaze的SPI Flash启动&#xff08;附时钟连接避坑指南&#xff09; 在FPGA开发领域&#xff0c;Zynq系列因其ARMFPGA的异构架构而广受欢迎&#xff0c;网上教程资源也最为丰富。但这也导致了一个常见陷阱——许…...

Rust与Godot引擎集成:使用gdext构建高性能游戏模块

1. 项目概述&#xff1a;当Rust遇上Godot 如果你是一名游戏开发者&#xff0c;同时又对Rust语言的安全性、性能和现代特性着迷&#xff0c;那么你很可能和我一样&#xff0c;曾经在两个优秀的工具之间感到难以抉择。一边是上手快、生态繁荣的Godot引擎&#xff0c;另一边是能让…...

CANopen协议核心机制与工业自动化应用实践

1. CANopen协议的核心机制解析 CANopen协议作为工业自动化领域的通信标准&#xff0c;其核心在于三个关键机制&#xff1a;对象字典、网络管理&#xff08;NMT&#xff09;以及过程数据对象&#xff08;PDO&#xff09;/服务数据对象&#xff08;SDO&#xff09;。理解这些机制…...

关于python中打开文件,以及可能错误,介绍

**该mode是基于open()函数里参数的调整** 错误代码 f r"C:\dj\dw1.txt" b f.read(c) print(b) f.close() 正确代码 f open(r"C:\dj\dw1.txt") s f.read() print(s) f.close()open()函数需要后面的打开路径&#xff0c;r/R表示该代码的的原意 mode…...