2405C++,部分解析数格

原文

如果一个很大数格串,然后用户只想解析其中的一个字段,一般需要遍历所有串全部解析所有字段,这样效率就很低了.

如果可部分解析数格字段,就可避免全部解析了,从而获得更好的性能.

iguana已增加了支持部分解析数格特征,比如这样一个数格对象:

struct some_test_t {int id1;std::string name;
};
REFLECTION(some_test_t, id1, name);
struct dummy_nest_t {int id;some_test_t t;
};
REFLECTION(dummy_nest_t, id, t);

该对象序化成数格串后,我反序化时,我只想反序化dummy_nest_t::id该字段,其它的不需要解析.代码可这样写:

  dummy_nest_t t{42, {43, "tom"}};std::string str;iguana::to_json(t, str); //序化到`数格`{dummy_nest_t t1;iguana::from_json<&dummy_nest_t::id>(t1, str); //部分反序化到`dummy_nest_t::id`CHECK(t1.id == 42);}

from_json只会解析id对应的那段串,不会解析其它的串,所以t1中,只赋值id.

如果要部分解析嵌套对象some_test_t中的名字字段该怎么做呢?方法类似:

{some_test_t t1;iguana::from_json<&some_test_t::name, dummy_nest_t>(t1, str); //部分解析嵌套对象的`名字`字段CHECK(t1.name == "tom");
}

解析dummy_nest_t嵌套对象字段时,需要填充第二个参数,即根对象的类型,这里就是dummy_nest_t.

之所以嵌套对象需要填根对象的类型,是为了安全性,iguana部分解析是有约束条件的,条件就是不要有名字相同,否则,反序化时无法区分到底应该解析哪个.
填根对象类型时,iguana会在编译期检查所有字段,包括嵌套对象字段是否有重名,如果重名了就会给出一个编译期错误.

除此外,如果填一个不属于根对象的字段,iguana也会在编译期检查出来.

比如我部分解析时填了个不属于dummy_nest_t的字段:

some_test_t t1;iguana::from_json<&person::name, dummy_nest_t>(t1, str); //编译错误:成员不属于对象

如果存在重名字段对象呢?

struct some_test_t1 {int id;std::string name;
};
REFLECTION(some_test_t1, id, name);
struct dummy_nest_t1 {int id;some_test_t1 t;
};
REFLECTION(dummy_nest_t1, id, t);

dummy_nest_t1的字段id和嵌套对象some_test_t1的字段id,二者重名了,此时去部分解析:

dummy_nest_t1 t1;
iguana::from_json<&dummy_nest_t1::id>(t1, str); //编译错误:字段名重复

因此该部分解析非常安全的,因为它在编译期检查安全性.话说iguana无论是易用性还是各种很酷的特性都是很不错的,为啥star还这么少呢?
桃李不言,下自成蹊,相信总有一天大家会发现它是个多么好用的库.

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

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

相关文章

xyctf ez_rand

[核心的代码就是这一部分&#xff0c;只要得到v4的值&#xff0c;也就是随机种子&#xff0c;那就可以把值弄出来了。所以我们需要做的就是爆破随机种子。 然后有一点是需要注意的&#xff0c;IDA这里显示的数据有可能是小端序的&#xff0c;所以我们需要export data&#xff…

DSP实时分析平台设计方案:924-6U CPCI振动数据DSP实时分析平台

6U CPCI振动数据DSP实时分析平台 一、产品概述 基于CPCI结构完成40路AD输入&#xff0c;30路DA输出的信号处理平台&#xff0c;处理平台采用双DSPFPGA的结构&#xff0c;DSP采用TI公司新一代DSP TMS320C6678&#xff0c;FPGA采用Xilinx V5 5VLX110T-1FF1136芯片&#xff…

向量的旋转矩阵

我们都知道&#xff0c;矩阵的乘法可以表示旋转。那么&#xff0c;这一理论的数学机理是什么呢&#xff1f;以及&#xff0c;这个旋转角度该怎么用矩阵表示呢&#xff1f; 本文用二维向量旋转来推导旋转矩阵的公式。假设&#xff0c;我们有一个向量P(x, y)&#xff0c;准备通过…

http和https 所有的请求头信息

http 所有的请求头信息 HTTP请求头信息包含了客户端向服务器发送请求时附带的各种细节信息,帮助服务器更好地处理请求。这些头部字段多种多样,用于说明请求的各个方面,如客户端信息、请求的内容类型、缓存策略等。以下是一些常见的HTTP请求头字段,但请注意,这并非所有可能…

手撕sql面试题:找出所有观看视频ID “1001“ 的观看时长大于他们观看视频ID “1002“ 的观看时长的用户ID

分享最近面试的sql面试题&#xff1a; 下面是表结构&#xff1a; CREATE TABLE video_records ( video_id char(4) NOT NULL COMMENT 视频id, user_id char(4) NOT NULL COMMENT 用户id, play_duration int NOT NULL COMMENT 观看时长, PRIMARY KEY (video_id,…

Ubuntu卸载已安装软件

前言 在Linux系统上安装了一些软件&#xff0c;但是卸载起来相比于Windows系统麻烦的多&#xff0c;这里总结了两种办法&#xff0c;希望对遇到这种问题的小伙伴能够有所帮助 1.Ubuntu Software 卸载 1.点击桌面上的Ubuntu Software并且选择installed 选中想要卸载的软件再按…

51. 【Android教程】JSON 数据解析

在上一节我们学习了 xml 数据格式&#xff0c;如果你觉得 xml 的数据比较冗余&#xff0c;标签、属性等等定义过于复杂&#xff0c;那么这一节我们将继续学习另一种更精简、更高效的数据格式—— Json。它广泛的运用于数据持久化以及网络传输中&#xff0c;这一节我们一起学习 …

CTF(Capture The Flag)编码方式

CTF&#xff08;Capture The Flag&#xff09;比赛中&#xff0c;编码和解码是常见的挑战类别之一&#xff0c;涉及到各种不同的编码方式。以下是一些CTF中可能出现的编码技术列表&#xff1a; Base系列编码&#xff1a; Base16&#xff08;Hexadecimal&#xff09;&#xff1a…

Hi3519AV100 处理器⾼速全局快⻔相机

⾼速全局快⻔相机采⽤ 1英⼨全局快⻔ Sensor&#xff0c;⽀持 H.264/H.265 编码&#xff0c;8 百万 分辨率模式下最⾼帧率可达 50 帧/秒&#xff0c;1080P 模式下最⾼帧率可达 120 帧/秒。主控采⽤ Hi3519AV100 处理器&#xff0c;集成 2 Tops AI 算⼒ NPU &#xff0c;⽀持⼤…

SGP.32-12

有任何关于GSMA\IOT\eSIM\RSP\业务应用场景相关的问题&#xff0c;欢迎W: xiangcunge59 一起讨论, 共同进步 (加的时候请注明: 来自CSDN-iot). 3.9 SM-DS Use 3.9.2.2 Event Retrieval by the eIM 在文档中提到的“通过eIM检索事件”的过程涉及了IoT设备中的IPA&#…

浮子式水位计施工细则

1浮子式水位计应安装在水位测井内&#xff0c;安装示意图见下图。 2设备安装要求 以测井中心为基准参考点&#xff0c;将水位计底板放在工作平台上。将悬索与平衡锤固定或锁紧&#xff0c;慢慢将平衡锤放至井底。 3&#xff09;悬索另一端绕于水位轮&#xff0c;留长1m&#…

018、Python+fastapi,第一个Python项目走向第18步:ubuntu24.04 安装cuda和pytorch环境

一、说明 我们安装了pytorch环境之后&#xff0c;会用yolo v9 来测试一下&#xff0c;看8g 显存能不能跑下来&#xff0c;上次用无影云电脑&#xff0c;4cpu8g内存直接爆了&#xff0c;云电脑也死机了&#xff0c;提示一直占用内存不释放&#xff0c;我自己的云电脑不能占用内…

AI机器视觉平台赋能:实现智慧工厂质检产品缺陷精准识别

背景 随着人工智能浪潮的涌起&#xff0c;智能技术与制造业的交融日益紧密&#xff0c;智能化成为现代制造业不可或缺的核心竞争力。传统制造业与智能制造业在生产效率、产品质量等方面的巨大差异&#xff0c;正促使传统制造业积极拥抱智能化变革&#xff0c;以缩小发展鸿沟。 …

2024年五一杯高校数学建模竞赛(A题)|钢板切割问题 | 建模解析,小鹿学长带队指引全代码文章与思路

我是鹿鹿学长&#xff0c;就读于上海交通大学&#xff0c;截至目前已经帮200人完成了建模与思路的构建的处理了&#xff5e; 本篇文章是鹿鹿学长经过深度思考&#xff0c;独辟蹊径&#xff0c;通过路径优化解决钢板切割问题。结合贪心算法&#xff0c;Floyd-Warshall等多元算法…

JDBC连接流程

jdbc流程 1.加载MySQL驱动 Class.forName(“com.mysql.jdbc.Driver”); 2.获取MySQL连接 Connetion con DriverManager.getConnetion(url,root,password); 3.设置参数&#xff0c;预注入SQL语句 PrepareStatement prep con.prepareStatement(“select * from dual”); 4.…

WPS文字页面横向

要将WPS文字页面设置为横向&#xff0c;可以按照以下步骤操作&#xff1a;12 打开WPS文字文档&#xff0c;点击“页面布局”选项卡。在“页面布局”中找到“纸张方向”选项。选择“横向”&#xff0c;这样整篇文档的页面方向就会变为横向。 如果只需要将文档中的特定页面设置…

vue3实现移动端,PC端响应式布局

纯移动端|PC端 这种适用于只适用一个端的情况 方法&#xff1a;amfe-flexible postcss-pxtorem相结合 ① 执行以下两个命令 npm i -S amfe-flexible npm install postcss-pxtorem --save-dev② main.js文件引用 import amfe-flexible③ 根目录新建一个postcss.config.js文件…

VS2022 .Net6.0 无法打开窗体设计器

拿Vs2022 建了个Demo&#xff0c;运行环境是net6.0-windows&#xff0c;无论双击或是右键都打不开窗体设计器 打开项目目录下的*.csproj.user <?xml version"1.0" encoding"utf-8"?> <Project ToolsVersion"Current" xmlns"htt…

CHM 创建工具

确实有一些可替代HTML Help Workshop的工具&#xff0c;它们同样能帮助你创建、编辑和编译CHM文件&#xff0c;以下是一些备选方案&#xff1a; HelpNDoc: 这是一款强大的帮助文件创作软件&#xff0c;支持包括CHM在内的多种输出格式。它拥有直观的界面&#xff0c;适合初学者和…

vue-treeselect 实现懒加载 + 远程模糊搜索 支持多选,可悬浮提示选择项所有层级 已封装为组件

今天实现一个客户单位组织树的功能&#xff0c;不限层级&#xff0c;数据量巨大&#xff0c;采用vue-treeselect 实现懒加载 远程搜索 这是vue iview组件 element的需要改一下tooltip的写法 这个支持对选择的单位全部层级进行悬浮提示&#xff08;也无法在下面下拉回显&am…