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、尽量使用新标准的编译器

四、总结

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

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

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

相关文章

Linux--进程间通信之命名管道

目录 前言概念命名管道的创建命名管道特性 命名管道通信建立连接资源处理 Client && Server通信总结 前言 上一篇文章介绍匿名管道的进程间通信只适合在具有血缘关系的进程间进行通信&#xff0c;但是如果我们想让两个不相关的进程实现通信&#xff0c;使用匿名管道显…

Kafka:安装与简单使用

文章目录 下载安装windows安装目录结构启动服务器创建主题发送一些消息启动消费者设置多代理集群常见问题 工具kafka tool 常用指令topic查看topic删除topic 常见问题参考文献 下载安装 下载地址&#xff1a;kafka-download windows安装 下载完后&#xff0c;找一个目录解压…

notepad++配置python2环境

&#xff08;1&#xff09;python2版本下载&#xff1a;Index of /ftp/python/2.7.8/https://www.python.org/ftp/python/2.7.8/ &#xff08;2&#xff09; 配置notepad环境 1.打开Notepad&#xff0c;点击“插件”-“插件管理器”&#xff0c;在“可用”选项卡中&#xff0c…

前言技术 VScode + 其他插件-2

一、扩展插件 1.1 chinese 作用&#xff1a;使得软件变成中文显示 1.2 prettier 作用&#xff1a;格式化代码 需要多重配置&#xff1b;看视频 第一步&#xff1a;安装 第二步&#xff1a;软件设置 第三步&#xff1a;查询 save , 修改保存时自动对齐格式&#xff0c;打✔…

【软考】系统集成项目管理工程师(五)项目立项管理【5分】

一、 项目建议书 1、定义 项目建议书又称为立项申请&#xff1b;建设单位向上级主管部门提交项目申请时所必须的文件&#xff0c;是对拟建项目提出的框架性的总体设想&#xff1b;是项目发展周期的初始阶段&#xff0c;是国家或上级主管部门选择项目的依据&#xff0c;也是可行…

WordPress外贸建站Astra免费版教程指南(2023)

在WordPress的外贸建站主题中&#xff0c;有许多备受欢迎的主题&#xff0c;如AAvada、Astra、Hello、Kadence等最佳WordPress外贸主题&#xff0c;它们都能满足建站需求并在市场上广受认可。然而&#xff0c;今天我要介绍的是一个不断颠覆建站人员思维的黑马——Astra主题。 …

Hudi第二章:集成Spark

系列文章目录 Hudi第一章&#xff1a;编译安装 Hudi第二章&#xff1a;集成Spark 文章目录 系列文章目录前言一、安装Spark1、安装Spark2.安装hive 二、spark-shell1.启动命令2.插入数据3.查询数据1.转换DF2.查询 3.更新4.时间旅行5.增量查询6.指定时间点查询7.删除数据1.获取…

linux Mysql 8.0.16 安装搭建

文章目录 Mysql 搭建一、安装包下载二、创建用户组用户和修改权限三、配置my.cnf Mysql 搭建 一、安装包下载 mysql 下载地址&#xff1a;https://downloads.mysql.com/archives/community/ 这里有所有的mysql的版本&#xff0c;下载自己需要的版本&#xff0c;我们这里下载 …

视频高效剪辑,批量调整视频速度,让视频更加精彩

你是否曾经需要调整多个视频的速度&#xff0c;但却苦于手动操作效率低下&#xff1f;如果你也遇到了这样的问题&#xff0c;那么是时候采取行动&#xff0c;使用一款高效易用的视频处理工具了。 首先&#xff0c;我们要进入好简单批量智剪&#xff0c;并在板块栏里选择“任务…

搭建自己的搜索引擎之五

一、前言 接上文 搭建自己的搜索引擎之四&#xff0c;下面继续介绍茴香豆茴字的另外两种写法。 二、Jest Jest是ES的Java Http Rest客户端&#xff0c;它主要是为了弥补以前ES自有API缺少HttpRest接口客户端的不足&#xff0c;但因为现在ES官方已经提供了RestClient ,该项目已…

cJSON.c 在mfc中编译失败报 lnk2005错误

问题一、在MFC工程中导入cJson.c 编译时报以下错误&#xff1a; 严重性 代码 说明 项目 文件 行 禁止显示状态 错误 C1853 “x64\Release\xxx.pch”预编译头文件来自编译器的早期版本&#xff0c;或者预编译头为 C 而在 C 中使用它(或相反) xxx …

【广州华锐互动】鱼类授精繁殖VR虚拟仿真实训系统

随着科技的不断发展&#xff0c;虚拟现实技术在各个领域的应用越来越广泛。在养殖业中&#xff0c;VR技术可以帮助养殖户进行家鱼授精实操演练&#xff0c;提高养殖效率和繁殖成功率。本文将介绍利用VR开展家鱼授精实操演练的方法和应用。 首先&#xff0c;我们需要了解家鱼授精…

WorkPlus私有化部署IM即时通讯平台,构建高效安全的局域网办公环境

随着数字化转型的加速&#xff0c;政府机构与企业对高效、安全的即时通讯和协作工具的需求日益增长。企业微信和钉钉作为当前市场上较为常见的通讯工具&#xff0c;虽然在一定程度上满足了企业内部协作的需求&#xff0c;但仍存在一些问题&#xff0c;如数据安全性、私有化部署…

N 皇后问题

N 皇后问题研究的是如何将 N 个皇后放置在 N x N 的棋牌上&#xff0c;并且使皇后彼此之间不能相互攻击。 国际象棋的规则&#xff0c;皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子 解决思路是&#xff1a;剪枝 回溯方法 解决问题 (1).使用二维数组创建棋牌格子 g…

C++与QML交互总结二

目录 1.CPP调用QML 1.1 QMetaObject::invokeMethod调用 1.2 CPP中的信号绑定qml中的槽 2.QML调用CPP 2.1 QML单实例注册 2.2 将类对象注册到QML的上下文中 2.3 QML信号调用CPP槽 3.QML中注入一个cpp实例 3.1qmlRegisterType 3.2QML_ELEMENT 4.附加属性: QML_ATTACHE…

面试题:说一下SpringBoot的自动配置原理

文章目录 引言工作原理剖析EnableAutoConfiguration自动配置生效总结 引言 不论在工作中&#xff0c;亦或是求职面试&#xff0c;Spring Boot已经成为我们必知必会的技能项。除了某些老旧的政府项目或金融项目持有观望态度外&#xff0c;如今的各行各业都在飞速的拥抱这个已经…

c==ubuntu+vscode debug redis7源码

新建.vscode文件夹&#xff0c;创建launch.json和tasks.json {"version": "0.2.0","configurations": [{"name": "C/C Launch","type": "cppdbg","request": "launch","prog…

Flink CDC MySQL同步MySQL错误记录

1、启动 Flink SQL [appuserwhtpjfscpt01 flink-1.17.1]$ bin/sql-client.sh2、新建源表 问题1&#xff1a;Encountered “(” 处理方法&#xff1a;去掉int(11)&#xff0c;改为int Flink SQL> CREATE TABLE t_user ( > uid int(11) NOT NULL AUTO_INCREMENT COMME…

1 论文笔记:Efficient Trajectory Similarity Computation with ContrastiveLearning

2022CIKM 1 intro 1.1 背景 轨迹相似度计算是轨迹分析任务&#xff08;相似子轨迹搜索、轨迹预测和轨迹聚类&#xff09;最基础的组件之一现有的关于轨迹相似度计算的研究主要可以分为两大类&#xff1a; 传统方法 DTW、EDR、EDwP等二次计算复杂度O(n^2)缺乏稳健性 会受到非…

【Linux】进程控制基础知识

目录 一&#xff0c;fack回顾 二&#xff0c;进程终止 1.进程终止&#xff0c;操作系统做了什么&#xff1f; 2.进程终止&#xff0c;常见的方式 1.main函数的&#xff0c;return 返回码 2. exit()函数 三&#xff0c;进程等待 1. 回收进程方法 &#xff08;1. wait…