源码赏析: 数据结构转换工具 configor (一)
一、configor
先贴地址 configor,先看configor的特性:
- Header-only & STL-like
- Custom type conversion & serialization
- Complete Unicode support
- ASCII & Wide-character support
说白了,这个工具用于自定义类型的转换和序列化/反序列化。目前作者已经实现了任何自定义数据类型转换为流式数据,并可将流式数据转换为json,按照作者的plan,或许会增加ini、xml等格式转换。
二、使用代码示例
struct User
{std::string name;int age;// bind custom type to configorCONFIGOR_BIND(json::value, User, REQUIRED(name), OPTIONAL(age))
};// User -> json
json::value j = User{"John", 18};
// json -> User
User u = json::object{{"name", "John"}, {"age", 18}};// User -> string
std::string str = json::dump(User{"John", 18});
// string -> User
User u = json::parse("{\"name\": \"John\", \"age\": 18}");// User -> stream
std::cout << json::wrap(User{"John", 18});
// stream -> User
User u;
std::cin >> json::wrap(u);
三、珠玉撷取
到不至于说这个工具非常强大,同类型的开源项目还有一些,如xpack 、msgpack,这两个开源项目我们再后面会分享。不过,在框架设计和代码实现上,configor绝对是顶级的,值得好好学习的。精读高级武学功法,勤奋精进,有助于我们彻底打开任督二脉,在c++编码世界里笑傲江湖。
我们关注自定义结构里面这样一个宏:
CONFIGOR_BIND(json::value, User, REQUIRED(name), OPTIONAL(age))
CONFIGOR_BIND宏函数定义如下:
// Bind custom type to configor value
// e.g.
// CONFIGOR_BIND(json, myclass, REQUIRED(field1), REQUIRED(field2, "field2 name"))
// CONFIGOR_BIND(json, myclass, OPTIONAL(field1), OPTIONAL(field2, "field2 name"))
#define CONFIGOR_BIND(value_type, custom_type, ...) \friend void to_value(value_type& c, const custom_type& v) \{ \__CONFIGOR_EXPAND(__CONFIGOR_PASTE(__CONFIGOR_COMBINE_PASTE1, __CONFIGOR_TO_CONF_CALL_OVERLOAD, __VA_ARGS__)) \} \friend void from_value(const value_type& c, custom_type& v) \{ \__CONFIGOR_EXPAND( \__CONFIGOR_PASTE(__CONFIGOR_COMBINE_PASTE1, __CONFIGOR_FROM_CONF_CALL_OVERLOAD, __VA_ARGS__)) \}
粗略一看,实际上就是实现了to_value和from_value实现 value_type 与 自定义类型 custom_type之间的转换(序列化与反序列化)。
#define __CONFIGOR_EXPAND(x) x
#define __CONFIGOR_PASTE(parse1, func, ...) \__CONFIGOR_EXPAND(__CONFIGOR_GET_ARG_MAX50( \__VA_ARGS__, __CONFIGOR_PASTE50, __CONFIGOR_PASTE49, __CONFIGOR_PASTE48, __CONFIGOR_PASTE47, \__CONFIGOR_PASTE46, __CONFIGOR_PASTE45, __CONFIGOR_PASTE44, __CONFIGOR_PASTE43, __CONFIGOR_PASTE42, \__CONFIGOR_PASTE41, __CONFIGOR_PASTE40, __CONFIGOR_PASTE39, __CONFIGOR_PASTE38, __CONFIGOR_PASTE37, \__CONFIGOR_PASTE36, __CONFIGOR_PASTE35, __CONFIGOR_PASTE34, __CONFIGOR_PASTE33, __CONFIGOR_PASTE32, \__CONFIGOR_PASTE31, __CONFIGOR_PASTE30, __CONFIGOR_PASTE29, __CONFIGOR_PASTE28, __CONFIGOR_PASTE27, \__CONFIGOR_PASTE26, __CONFIGOR_PASTE25, __CONFIGOR_PASTE24, __CONFIGOR_PASTE23, __CONFIGOR_PASTE22, \__CONFIGOR_PASTE21, __CONFIGOR_PASTE20, __CONFIGOR_PASTE19, __CONFIGOR_PASTE18, __CONFIGOR_PASTE17, \__CONFIGOR_PASTE16, __CONFIGOR_PASTE15, __CONFIGOR_PASTE14, __CONFIGOR_PASTE13, __CONFIGOR_PASTE12, \__CONFIGOR_PASTE11, __CONFIGOR_PASTE10, __CONFIGOR_PASTE9, __CONFIGOR_PASTE8, __CONFIGOR_PASTE7, \__CONFIGOR_PASTE6, __CONFIGOR_PASTE5, __CONFIGOR_PASTE4, __CONFIGOR_PASTE3, __CONFIGOR_PASTE2, \parse1)(parse1, func, __VA_ARGS__))
真吓人啊,别怕。我们心里要始终坚持一点,宏千变万化,本质也是字符串的替换。
#define __CONFIGOR_GET_ARG_MAX50(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, \_20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, \_37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, ARG, ...) \ARG#define __CONFIGOR_COUNT_ARGS_MAX50(...) \__CONFIGOR_EXPAND(__CONFIGOR_GET_ARG_MAX50(__VA_ARGS__, 50, 49, 48, 47, 46, 45, 44, 43, 42, 41, 40, 39, 38, 37, \36, 35, 34, 33, 32, 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, \18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0))
这是一个宏参数计数器,用于统计传入参数的个数。
先下班,后面再续上~~😂
相关文章:
源码赏析: 数据结构转换工具 configor (一)
一、configor 先贴地址 configor,先看configor的特性: Header-only & STL-likeCustom type conversion & serializationComplete Unicode supportASCII & Wide-character support 说白了,这个工具用于自定义类型的转换和序列化…...
使用java调用python批处理将pdf转为图片
你可以使用Java中的ProcessBuilder来调用Python脚本,并将PDF转换为图片。以下是一个简单的Java代码示例,假设你的Python脚本名为pdf2img.py: import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader…...
机器学习——自领域适应作业
任务 游戏里面的话有很多跟现实不一样的情况。 想办法让中间的特征更加的接近,让feat A适应feat B,产生相对正常的输出。 在有标签数据和没有数据的上面进行训练,并能预测绘画图像。 数据集 训练5000张总数,每类有500张测试100…...
ValidatorUtil字段验证工具类
字段验证工具类 package com.aa.bb.cc.common.utils;import com.aa.bb.cc.common.exception.BusinessException; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang3.StringUtils;import javax.validation.ConstraintViolation; import…...
Python 自动化之处理图片(一)
图片美化与大小调整 文章目录 图片美化与大小调整前言一、基本结构二、引入库三、用户输入模块四、图片美化模块五、大小调整模块总结 前言 本文主要分为两部分。一是图片的美化吧算是,主要从亮度、对比、色彩饱和度、锐度四个方面进行美化;二是图片的像…...
Axure动态面板的应用与ERP系统登录界面、主页左侧菜单栏、公告栏的绘制
目录 一、动态面板 1.1 简介 1.2 使用动态面板的原因 二、动态面板之轮播图实现案例 2.1 完成步骤 2.2 最终效果 三、动态面版之多方式登录案例 四、动态面板之后台主界面左侧菜单栏 五、ERP登录界面 六、ERP主界面菜单栏 七、ERP公告栏 八、登录页面跳转公告栏 一…...
电机(按工作电源分类)介绍
文章目录 一、什么是电机?二、按工作电源分类直流电机1.直流有刷电机结构工作原理:直流减速电机 2.直流无刷电机结构工作原理: 3.总结结构和工作原理:效率和功率损耗:调速性能:寿命和可靠性:应用…...
Web前端JS通过使用AudioWorkletNode() 获取 Video/Audio 视音频声道(左右声道|多声道)
写在前面: 在之前的博文Web前端JS如何获取 Video/Audio 视音频声道(左右声道|多声道)、视音频轨道、音频流数据中,介绍了通过使用AudioContext.createScriptProcessor()方法来获取视音频音轨(声道)数据。但由于W3C不再推荐使用该A…...
力扣LeetCode75题
为了面试,小伙伴们可以平时练下算法题,有备无患。 LeetCode 75 - 学习计划 - 力扣(LeetCode)全球极客挚爱的技术成长平台...
如何向领导汇报工作?一篇文章告诉你!
给领导汇报工作可以从两个方面考虑:一是工作汇报文件的制作;一是汇报方式。一份全面、清晰且准确的文件,加上一目了然的、科技满满的汇报方式,相比领导不满意都难~下面就让你全部get! 一、工作汇报的文字内…...
GPT-4.5!!!
GPT-4 还没用明白,GPT-4.5 就要发布了。 最近,OpenAI 泄露了 GPT-4.5 的发布页面,除了进一步增强复杂推理和跨模态理解,GPT-4.5 增加了一个更加强大的功能——3D。 3D 功能的进一步支持,也就意味着多模态最后一块版图…...
kafka入门(四):kafka生产者发送消息
创建生产者实例和构建消息之后,就可以开始发送消息了。 发送消息主要有三种模式:发后即忘、同步、异步。 发后即忘: 就是直接调用 生产者的 send方法发送。 发后即完,只管往 kafka中发送消息,而不关心消息是否正确…...
redis集群模糊获取缓存redisKey
redis cluster集群删除指定模糊redisKey的信息 **public int deleteRedisKey(String key){AtomicReference<Integer> result new AtomicReference<>(0);busnessLogger.info("开始删除指定业务的模糊Key,deleteRedisKey:{}",key);try{Set<HostAndPor…...
100GPTS计划-AI翻译TransLingoPro
地址 https://poe.com/TransLingoPro https://chat.openai.com/g/g-CfT8Otig6-translingo-pro 测试 输入: 我想吃中国菜。 预期翻译: I want to eat Chinese food. 输入: 请告诉我最近的医院在哪里。 预期翻译: Please tell me where the nearest hospital is. 输入: 明天…...
Linux install manual 1Panel
前言 1Panel 是一个现代化、开源的 Linux 服务器运维管理面板。1Panel 的功能和优势包括: 快速建站:深度集成 Wordpress 和 Halo,域名绑定、SSL 证书配置等一键搞定;高效管理:通过 Web 端轻松管理 Linux 服务器,包括主机监控、文件管理、数据库管理、容器管理等;安全可…...
母婴服务品牌网站的效果如何
随着三胎政策落实及人们生活水平提升,母婴市场发展迅速上升,加之以90后、00后适龄生育的人群悦己消费加强,孕前孕后及婴儿本身就会使用相当好的服务,这也为市场带来了较大机会。 近几年,老品牌在不断加力,…...
C语言--有一个3*4的矩阵,求出其中最大值的那个元素的值,以及其所在的行号和列号
一.题目描述 有一个3*4的矩阵,要求求出其中最大值的那个元素的值,以及其所在的行号和列号 比如:给定一个3*4的矩阵如下 输出结果:最大值为 12 ,行号为3, 列号为2 二.思路分析 打擂台算法: 先思考…...
安全算法(二):共享密钥加密、公开密钥加密、混合加密和迪菲-赫尔曼密钥交换
安全算法(二):共享密钥加密、公开密钥加密、混合加密和迪菲-赫尔曼密钥交换 本章介绍了共享密钥加密、公开密钥加密,和两种加密方法混合使用的混合加密方法;最后介绍了迪菲-赫尔曼密钥交换。 加密数据的方法可以分为…...
MYSQL练题笔记-高级字符串函数 / 正则表达式 / 子句-简单3题
这个系列先写了三题,比较简单写在一起。 1.修复表中的名字相关的表和题目如下 看题目就知道是有关字符串函数的,于是在书里查询相关的函数,如下图,但是没有完全对口的函数,所以我还是去百度了。 然后发现结合上面的4个…...
vue扭蛋机抽奖游戏
简易扭蛋机demo 这是一个使用CSS3和JavaScript实现的扭蛋机抽奖游戏。该游戏的主要功能是通过点击按钮进行抽奖,抽奖过程中会显示滚动的小球,最终随机停止并显示一个中奖小球。 该游戏的抽奖过程如下: 当用户点击抽奖按钮时,首先检查当前是否正在进行抽奖任务或者当前有小…...
思科Packet Tracer实战:RIP、OSPF、BGP三大路由协议配置避坑指南
思科Packet Tracer实战:RIP、OSPF、BGP三大路由协议配置避坑指南 在网络工程的学习和实践中,动态路由协议的配置是核心技能之一。作为网络工程师的"模拟沙盒",Cisco Packet Tracer为我们提供了安全、便捷的实验环境。本文将聚焦RIP…...
倍福CX系列WinCE系统刷机与FTP配置保姆级教程(附CeHost远程桌面工具)
倍福CX系列WinCE系统刷机与远程维护全流程实战指南 工业现场最怕遇到控制系统突然罢工,尤其是那些运行着老版本WinCE的倍福CX控制器。上周我就碰到这么一出——产线上的一台CX5020突然无法连接编程软件,生产线眼看就要停摆。幸好凭着对WinCE系统的熟悉&a…...
OpenVINO实战:从模型部署到边缘计算性能优化
1. OpenVINO入门:为什么选择这个推理加速神器 第一次接触OpenVINO是在三年前的一个安防项目,当时需要在低功耗边缘设备上跑人脸识别算法。试过TensorRT、ONNX Runtime之后,最终被OpenVINO的易用性和CPU优化效果惊艳到了——在Intel Core i5上…...
AXI4接口时序详解:从波形图到实战调试技巧
AXI4接口时序详解:从波形图到实战调试技巧 在FPGA和ASIC设计中,AXI4总线协议已经成为事实上的标准互联架构。不同于教科书式的理论描述,本文将带您深入实际工程场景,通过真实波形分析和调试案例,掌握AXI4接口时序的核心…...
n8n工作流自动化实战:如何用bge-m3本地嵌入模型搞定文件向量化(附Milvus避坑指南)
n8n工作流自动化实战:如何用bge-m3本地嵌入模型搞定文件向量化(附Milvus避坑指南) 在数据爆炸式增长的今天,如何高效处理非结构化数据成为技术团队面临的重大挑战。文件内容向量化作为构建智能搜索、推荐系统的基石,其…...
计算机毕设 java 农贸市场摊位出租系统 Java+SpringBoot 农贸市场摊位租赁管理平台 Web 版摊位预约出租报修系统
计算机毕设 java 农贸市场摊位出租系统 k52bf9(配套有源码 程序 mysql 数据库 论文)本套源码可以先看具体功能演示视频领取,文末有联 xi 可分享农贸市场摊位管理传统模式存在出租流程乱、预约不透明、报修处理慢、合同管理难等问题。为规范摊…...
Java开发必看:NullPointerException的5种常见场景及实战避坑指南
Java开发必看:NullPointerException的5种常见场景及实战避坑指南 在Java开发中,NullPointerException(NPE)堪称最令人头疼的运行时异常之一。无论是初入职场的新手,还是经验丰富的老手,都难免会在某个深夜被…...
vulmap漏洞扫描工具实战:从安装到批量检测Web中间件的完整指南
Vulmap漏洞扫描实战:高效检测Web中间件安全的全流程指南 在网络安全领域,Web中间件的漏洞往往是攻击者最常利用的入口点。面对层出不穷的安全威胁,安全从业者需要掌握高效精准的漏洞检测工具。本文将带您深入掌握Vulmap这一轻量级但功能强大的…...
Qwen-Ranker Pro与MySQL数据库集成:实现智能语义搜索
Qwen-Ranker Pro与MySQL数据库集成:实现智能语义搜索 1. 引言 想象一下这样的场景:你的电商平台有数百万商品,用户搜索"适合夏天穿的轻薄透气运动鞋",传统的关键词搜索可能返回一堆包含"夏天"、"轻薄&…...
如何用YOLOv5+Transformer搞定夜间行人检测?多光谱融合实战教程
夜间多光谱行人检测实战:YOLOv5与Transformer融合的工程化解决方案 当城市夜幕降临,传统视觉系统开始"失明"——这正是我们团队去年为某智慧园区项目部署安防系统时遇到的棘手问题。常规RGB摄像头在低照度环境下漏检率飙升,而单纯依…...
