跟我学c++中级篇——std::tuple的复合操作

一、std::tuple

std::tuple在应用中有着独特的作用,它本身可以存储非同质化的数据类型,这个在某些场合下非常有用。std::tuple的初级应用,如生成和获取,在前面的几篇文章中已经进行了较详细的说明。但std::tuple仍然有一些复杂的应用,在实际的应用过程中有很大的作用,比如遍历,本文将在这些角度上进行举例分析。

二、复合操作
1、遍历
std::tuple的遍历,在STL库并未提供,它的实现机理是一个特化的过程,所以不能将其理解为容器,这也是没有提供遍历的可能吧。在前面讲过的遍历变参的基础上,其实还是比较容易想到如何遍历tuple的:

template <class Tp, std::size_t N> struct TupleData {static void output(const Tp &t) {TupleData<Tp, N - 1>::output(t);std::cout << std::get<N - 1>(t) << std::endl;}
};
//利用模板的偏特化
template <class Tp> struct TupleData<Tp, 1> {static void output(const Tp &t) { std::cout << std::get<0>(t) << std::endl; }
};template <class... Args> void PrintTuple(const std::tuple<Args...> &t) {TupleData<decltype(t), sizeof...(Args)>::output(t);
}
void ForEachTuple() { PrintTuple(std::make_tuple("id", "123456", 23, "man")); }

而使用make_index_sequence方式遍历Tuple需要C++17以上的版本,这个在前面的文章中提供过,这里再拷贝一次对比:

template <typename Tp, std::size_t... ID> void DisplayTuple(const Tp &tp, std::index_sequence<ID...>) {((std::cout << std::get<ID>(tp) << std::endl), ...);
}template <typename... Args> void GetTuple(const std::tuple<Args...> &tp) {DisplayTuple(tp, std::index_sequence_for<Args...>{});//等同std::make_index_sequence<sizeof...(Args)>{}
}

也可以使用std::apply自动解包:

template <typename T, typename F> auto static useApplyDisplay(T &&tp, F &&fn) {std::apply([&fn](auto &&...args) { ((fn(args)), ...); }, tp);
}int main() {std::tuple tp("abc", 3, 66, '4', "object");auto displayTuple = [](auto &&a) { std::cout << a << " "; };useApplyDisplay(tp, displayTuple);return 0;
}

需要注意的是,无法直接象遍历容器一样使用变量索引std::get之类的方式去遍历模板中的tuple。遍历的方法有很多,开源库和网上有不少的相关例程,特别是随着C++更新的标准出台,更多简单易行的方法会跟随出来。

  • 可参看前文“c++17中的apply和make_from_tuple”

2、组合
这个和std::tuple_cat类似:

template <typename Tp1, typename Tp2, std::size_t... Id1, std::size_t... Id2>
constexpr auto tupleCat(const Tp1 &tp1, const Tp2 &tp2, std::index_sequence<Id1...>, std::index_sequence<Id2...>) {return std::make_tuple(std::get<Id1>(tp1)..., std::get<Id2>(tp2)...);
}template <typename... Args1, typename... Args2>
constexpr auto operator+(const std::tuple<Args1...> &t1, const std::tuple<Args2...> &t2) {return tupleCat(t1, t2, std::index_sequence_for<Args1...>{}, std::index_sequence_for<Args2...>{});
}
int main() {std::tuple t1{1, 3.0f, "abc"};std::tuple t2{33, "1b8c", 'a'};auto x = t1 + t2;return 0;
}

其实弄明白了std::index_sequence, 这些都好理解了。还是要抓住基础中的关键环节,这才是灵活应用的前提。

三、总结
std::tuple很多人看上去觉得有些鸡肋,确实也如此,从易用角度来看,它还需要一段路来走。不过,还是那句话,只有最合适的,没有最好的。只要有伯乐,总会有千里马。把它用在合适的场景上,就能够起到事半功倍的效果。

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

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

相关文章

阿里云幻兽帕鲁服务器有用过的吗?搭建简单啊

玩转幻兽帕鲁服务器&#xff0c;幻兽帕鲁Palworld多人游戏专用服务器一键部署教程&#xff0c;阿里云推出新手0基础一键部署幻兽帕鲁服务器教程&#xff0c;傻瓜式一键部署&#xff0c;3分钟即可成功创建一台Palworld专属服务器&#xff0c;成本仅需26元&#xff0c;阿里云百科…

了解海外云手机的多种功能

随着社会的高度发展&#xff0c;海外云手机成为商家不可或缺的工具&#xff0c;为企业出海提供了便利的解决方案。然而&#xff0c;谈及海外云手机&#xff0c;很多人仍不了解其强大功能。究竟海外云手机有哪些功能&#xff0c;可以为我们做些什么呢&#xff1f; 由于国内电商竞…

Nginx方向代理和负载均衡配置

1. Nginx介绍 2.Nginx常用命令 cd /usr/local/nginx/sbin/ ./nginx 启动 ./nginx -s stop 停止 ./nginx -s quit 安全退出 ./nginx -s reload 重新加载配置文件 如果我们修改了配置文件&#xff0c;就需要重新加载。 ps aux|grep nginx 查看nginx进程3.nginx配置文件 …

记录解决duboo注册问题和投诉问题

最近项目组遇到运维一个投诉&#xff1a;我们的dubbo服务是以接口维度注册到nacos上的&#xff0c;再高峰期无法下线服务维度导致运维风险增加。针对这个问题&#xff0c;我查了下&#xff0c;确实是这样的&#xff0c;因为我们使用的dubbo是3.0以下的&#xff0c;所以注册到注…

Vue2中v-for 与 v-if 的优先级

在Vue2中&#xff0c;v-for 和 v-if 是常用的指令&#xff0c;它们在前端开发中非常有用。但是&#xff0c;当我们在同一个元素上同时使用这两个指令时&#xff0c;就需要注意它们的优先级关系了。 首先&#xff0c;让我们了解一下v-for和v-if的基本用法。 v-for 是Vue的内置…

问题:必须坚持以中国式现代化推进中华民族伟大复兴,既不走封闭僵化的老路,也不走 #媒体#知识分享

问题&#xff1a;必须坚持以中国式现代化推进中华民族伟大复兴&#xff0c;既不走封闭僵化的老路&#xff0c;也不走 A、中国特色社会主义道路 B、改革开放之路 C、改旗易帜的邪路 D、中国式现代化之路 参考答案如图所示

2024年GPT如何发展?

2023 年&#xff0c;人工智能领域最具影响的莫过于 GPT-4、ChatGPT 了。 ChatGPT 凭一己之力掀起了 AI 领域的热潮&#xff0c;火爆全球&#xff0c;似乎开启了第四次工业革命。 ChatGPT 入选《Nature》2023 年度十大人物&#xff08;Nature’s 10&#xff09;&#xff0c;这…

Git详细讲解

文章目录 一、Git相关概念二、本地分支中文件的添加 、提交2.1 文件状态2.2 创建Git仓库2.2.1 git init2.2.2 git clone 2.3 添加操作(git add)2.4 提交操作&#xff08;git commit&#xff09;2.5 撤销操作2.5.1 撤销 add操作2.5.2 撤销 commit操作2.5.3 覆盖上一次的commit操…

极智一周 | 国产CPU系列汇总、鲲鹏、飞腾、平头哥 And so on

欢迎关注我的公众号 [极智视界]&#xff0c;获取我的更多技术分享 大家好&#xff0c;我是极智视界&#xff0c;带来本周的 [极智一周]&#xff0c;关键词&#xff1a;国产CPU系列汇总、鲲鹏、飞腾、平头哥 And so on。 邀您加入我的知识星球「极智视界」&#xff0c;星球目前…

【开源】JAVA+Vue.js实现社区买菜系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、系统设计2.1 功能模块设计2.1.1 数据中心模块2.1.2 菜品分类模块2.1.3 菜品档案模块2.1.4 菜品订单模块2.1.5 菜品收藏模块2.1.6 收货地址模块 2.2 可行性分析2.3 用例分析2.4 实体类设计2.4.1 菜品分类模块2.4.2 菜品档案模块2.4.3…

哈希表(Hash Table)-----运用实例【通过哈希表来管理雇员信息】(java详解) (✧∇✧)

目录 一.哈希表简介&#xff1a; 实例介绍&#xff1a; 类的创建与说明&#xff1a; 各功能图示&#xff1a; 1.class HashTab{ }; 2. class EmpLinkedList{ }&#xff1b; 3. class Emp{ }&#xff1b; 4.测试&#xff1a; 运行结果&#xff1a; 最后&#xff0c;完整…

关于数字图像处理考试

我们学校这门科目是半学期就完结哦&#xff0c;同学们学习的时候要注意时间哦。 选择题不用管&#xff0c;到时候会有各种版本的复习资料的。 以下这些东西可能会是大题的重点&#xff1a; 我根据平时代码总结的&#xff0c;供参考 基本操作&#xff1a; 1.读图&#xff1a;…

【LeetCode】37. 解数独(困难)——代码随想录算法训练营Day30

题目链接&#xff1a;37. 解数独 题目描述 编写一个程序&#xff0c;通过填充空格来解决数独问题。 数独的解法需 遵循如下规则&#xff1a; 数字 1-9 在每一行只能出现一次。数字 1-9 在每一列只能出现一次。数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。&…

机器学习——有监督学习和无监督学习

有监督学习 简单来说&#xff0c;就是人教会计算机学会做一件事。 给算法一个数据集&#xff0c;其中数据集中包含了正确答案&#xff0c;根据这个数据集&#xff0c;可以对额外的数据希望得到一个正确判断&#xff08;详见下面的例子&#xff09; 回归问题 例如现在有一个…

linux系统非关系型数据库redis主从模式

redis主从模式 主从模式主从同步原理部署主从同步redis5.0.0之前的版本配置redis5.0.0之后的配置测试主从 主从模式 主从同步原理 主从 – 同步原理 从服务器会向主服务器发出SYNC指令&#xff0c;当主服务器接到此命令后&#xff0c;就会调用BGSAVE指令来创建一个子进程专门…

【深度学习:Bard】我们 AI 之旅的重要下一步

【深度学习&#xff1a;AI 之旅】我们 AI 之旅的重要下一步 Bard简介将 AI 的优势带入我们的日常产品中帮助开发人员利用 AI 进行创新大胆负责 人工智能是我们今天正在研究的最深刻的技术。无论是帮助医生更早地发现疾病&#xff0c;还是使人们能够用自己的语言获取信息&#x…

深度学习中的Droupout

1. 什么是Droupout Dropout的作用是防止过拟合。 Dropout在训练模型中是如何实现的呢&#xff1f;Dropout的做法是在训练过程中按一定比例&#xff08;比例参数可设置&#xff09;随机忽略或屏蔽一些神经元。这些神经元被随机“抛弃”&#xff0c;也就是说它们在正向传播过程…

【C/C++】整数及乘积的溢出问题

文章目录 一、为什么会溢出&#xff1f;二、怎样解决&#xff1f;三、看个例题四、补充&#xff1a;scanf和cin的区别 一、为什么会溢出&#xff1f; 整数乘积的溢出问题是指两个整数相乘得到的结果超过了所能表示的数据类型的范围。 在计算机中&#xff0c;整数的表示是有限…

移动应用开发Android 创建第一个Android项目

文章目录 一、创建第一个Android项目1.1 准备好Android Studio1.2 运行程序1.3 程序结构是什么app下的结构res - 子目录&#xff08;所有图片、布局、字AndroidManifest.xml 有四大组件&#xff0c;程序添加权限声明 Project下的结构 二、开发android时&#xff0c;部分库下载异…

Spinnaker多云持续交付平台: 部署Minio存储服务

目录 一、实验 1.环境 2.K8S storage节点部署NFS 3.K8S 动态创建PV 4.K8S master节点部署HELM3 4.K8S master节点部署Minio存储服务&#xff08;第一种方式安装&#xff09; 5.Minio客户端安装MC命令 6.K8S master节点使用Docker 部署Minio存储服务&#xff08;第二种方…