nlohmann/json——NLOHMANN_JSON_SERIALIZE_ENUM
目录
源码如下:
源码分析:
使用示例:
源码如下:
/*!
@brief macro to briefly define a mapping between an enum and JSON
@def NLOHMANN_JSON_SERIALIZE_ENUM
@since version 3.4.0
*/
#define NLOHMANN_JSON_SERIALIZE_ENUM(ENUM_TYPE, ...) \template<typename BasicJsonType> \inline void to_json(BasicJsonType& j, const ENUM_TYPE& e) \{ \static_assert(std::is_enum<ENUM_TYPE>::value, #ENUM_TYPE " must be an enum!"); \static const std::pair<ENUM_TYPE, BasicJsonType> m[] = __VA_ARGS__; \auto it = std::find_if(std::begin(m), std::end(m), \[e](const std::pair<ENUM_TYPE, BasicJsonType>& ej_pair) -> bool \{ \return ej_pair.first == e; \}); \j = ((it != std::end(m)) ? it : std::begin(m))->second; \} \template<typename BasicJsonType> \inline void from_json(const BasicJsonType& j, ENUM_TYPE& e) \{ \static_assert(std::is_enum<ENUM_TYPE>::value, #ENUM_TYPE " must be an enum!"); \static const std::pair<ENUM_TYPE, BasicJsonType> m[] = __VA_ARGS__; \auto it = std::find_if(std::begin(m), std::end(m), \[&j](const std::pair<ENUM_TYPE, BasicJsonType>& ej_pair) -> bool \{ \return ej_pair.second == j; \}); \e = ((it != std::end(m)) ? it : std::begin(m))->first; \}
源码分析:
从注释看,NLOHMANN_JSON_SERIALIZE_ENUM宏是将用户定义的枚举类型与JSON进行映射。其实际上是定义了两个模板函数,to_json和from_json,宏的第一个参数ENUM_TYPE是用户定义的枚举类型,后面携带了可变参数,即...符号。
// asset检查,看ENUM_TYPE是否是枚举,其中#符号为宏中的特殊运算符,在预编译时期,用于将宏参数转换为字符串
static_assert(std::is_enum<ENUM_TYPE>::value, #ENUM_TYPE " must be an enum!");
// __VA_ARGS__为系统自定义变量,指向宏中的可变参数
static const std::pair<ENUM_TYPE, BasicJsonType> m[] = __VA_ARGS__;
// 在可变参数指定的map中查找
auto it = std::find_if(std::begin(m), std::end(m),
[e](const std::pair<ENUM_TYPE, BasicJsonType>& ej_pair) -> bool
{
return ej_pair.first == e;
});
j = ((it != std::end(m)) ? it : std::begin(m))->second;
使用示例:
enum class Type
{kType1 = 0,kType2 = 1,kType3 = 2,kType4 = 3,kType5 = 4
};NLOHMANN_JSON_SERIALIZE_ENUM(Type, {{Type::kType1, nullptr},{Type::kType2, "stopped"},{Type::kType3, "running"},{Type::kType4, "completed"},{Type::kType5, "completed"},
});int main(int argc, char *argv[])
{Type t = Type::kType4;nlohmann::json j = t;std::cout << "dump:" << j.dump() << std::endl;return 0;
}
运行结果如下:
dump:"completed"
相关文章:
nlohmann/json——NLOHMANN_JSON_SERIALIZE_ENUM
目录 源码如下: 源码分析: 使用示例: 源码如下: /*! brief macro to briefly define a mapping between an enum and JSON def NLOHMANN_JSON_SERIALIZE_ENUM since version 3.4.0 */ #define NLOHMANN_JSON_SERIALIZE_ENUM(EN…...
类和对象:运算符重载
本篇文章来介绍一下C中的运算符重载,以及与运算符重载有关的三个默认默认成员函数:赋值运算符重载,普通对象取地址与const对象取地址操作符重载,也就是下面图片中6个默认成员函数的后三个,前三个默认成员函数在之前文章…...
Vue中使用VueAMap
npm 安装 npm install vue-amap --save注册:高德地图 // 在main.js中注册:高德地图 import VueAMap from "vue-amap"; Vue.use(VueAMap); VueAMap.initAMapApiLoader({key: "你的高德key",plugin: ["AMap.AutoComplete", //输入提示插件"A…...
Vue中的路由介绍以及Node.js的使用
🏅我是默,一个在CSDN分享笔记的博主。📚📚 🌟在这里,我要推荐给大家我的专栏《Vue》。🎯🎯 🚀无论你是编程小白,还是有一定基础的程序员,这个专栏…...
将本地项目上传至Github详解
目录 1 前言2 本地代码上传2.1 命令行方法2.2 图形界面法2.3 结果 1 前言 GitHub是一个面向开源及私有软件项目的托管平台,因为只支持Git作为唯一的版本库格式进行托管,故名GitHub 。开发者常常将github作为代码管理平台,方便代码存储、版本…...
Vivado下PLL实验
文章目录 前言一、CMT(时钟管理单元)1、CMT 简介2、FPGA CMT 框图3、MMCM 框图4、PLL 框图 二、创建工程1、创建工程2、PLL IP 核配置3、进行例化 三、进行仿真1、创建仿真文件2、进行仿真设置3、进行行为级仿真 四、硬件验证1、引脚绑定2、生成比特流文…...
简单理解推挽输出和开漏输出
推挽输出原理图: 特点: 1、INT1时,OUTVDD;INT0时,OUTGND。 2、推挽输出的两种输出状态,一种是PMOS管S级端的电压VDD,一种是NMOS管S端的地GND。 开漏输出原理图: 特点: …...
C++之va_start、vasprintf、va_end应用总结(二百二十六)
简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 人生格言: 人生…...
OpenCV自学笔记十一:形态学操作(一)
目录 1、腐蚀 2、膨胀 3、通用形态学函数 4、开运算 5、闭运算 1、腐蚀 腐蚀(Erosion)是数字图像处理中的一种形态学操作,用于消除图像中边界附近的细小区域或缩小对象的大小。腐蚀操作通过卷积输入图像与结构元素(也称为腐…...
封装全局异常处理
文章目录 1 定义错误码类2 定义业务异常类3 全局异常处理器4 使用5 前端请求效果总结 1 定义错误码类 可以定义各种错误码枚举,比如业务,系统相关的报错信息 /*** 错误代码* 错误码** author leovany* date 2023/09/23*/ public enum ErrorCode {SU…...
python的requests响应请求,结果乱码,即使设置了response.encoding也没有用的解决方法
一、问题 如图: 一般出现乱码,我们会有三种解决方式,如下但是图中解决了发现还是不行, response.encodingresponse.apparent_encoding通过看网页源码对response.encodingutf8指定编码格式或者直接通过response.content.decode()来获得源码 出…...
PyCharm 手动下载插件
插件模块一直加载失败,报错信息: Marketplace plugins are not loaded. Check the internet connection and refresh. 尝试了以下方法,均告失败: pip 换源Manage Plugin Repositories...HTTP 代理设置...关闭三个防火墙 最后选…...
Gnomon绑定基础(约束 IK 节点)
点约束 方向约束 父约束 目标约束 修改后 对象方向 IK控制柄 直的骨骼,指定IK怎么弯曲 直的骨骼,指定IK怎么弯曲 样条曲线 数学节点 乘除节点 混合节点 注意...
STL常用遍历,查找,算法
目录 1.遍历算法 1.1for_earch 1.2transform 2.常用查找算法 2.1find,返回值是迭代器 2.1.1查找内置数据类型 2.1.2查找自定义数据类型 2.2fin_if 按条件查找元素 2.2.1查找内置的数据类型 2.2.2查找内置数据类型 2.3查找相邻元素adjeacent_find 2.4查找指…...
BCC源码内容概览(1)
接前一篇文章:BCC源码编译和安装 本文参考官网中的Contents部分的介绍。 BCC源码根目录的文件,其中一些是同时包含C和Python的单个文件,另一些是.c和.py的成对文件,还有一些是目录。 跟踪(Tracing) exam…...
mysql限制用户登录失败次数,限制时间
mysql用户登录限制设置 mysql 需要进行用户登录次数限制,当使用密码登录超过 3 次认证链接失败之后,登录锁住一段时间,禁止登录这里使用的 mysql: 8.1.0 这种方式不用重启数据库. 配置: 首先进入到 mysql 命令行:然后需要安装两个插件: 在 mysql 命令行中执行: mysql> INS…...
从利用Arthas排查线上Fastjson问题到Java动态字节码技术(下)
上一篇从Arthas的源码引出了Java动态字节码技术,那么这一篇就从几种Java字节码技术出发,看看Arthas是如何通过动态字节码技术做到无侵入的源码增强; Java大部分情况下都是解释执行的,也就是解释.class文件,所以如果我们…...
Ubuntu中安装Anaconda 如何将 路径导入为全局变量
第一步:将你的anaconda 路径复制下来,在终端输入对应路径。 echo export PATH"/home/你的用户名/anaconda3/bin:$PATH" >> ~/.bashrc 第二步:在终端输入下面命令或者重启系统。 source ~/.bashrc 在对应的anaconda安装目…...
【QT】Qt的随身笔记(持续更新...)
目录 Qt 获取当前电脑桌面的路径Qt 获取当前程序运行路径Qt 创建新的文本文件txt,并写入内容如何向QPlainTextEdit 写入内容QTimerQMessageBox的使用QLatin1StringQLayoutC在c头文件中写#include类的头文件与直接写class加类名有何区别mutable关键字前向声明 QFontQ…...
【LeetCode-简单题】589. N 叉树的前序遍历
文章目录 题目方法一:单循环栈做法方法二:递归 题目 方法一:单循环栈做法 关键在于子节点的入栈顺序,决定了子节点的出栈顺序, 因为是前序遍历 所以压栈顺序先让右边的入栈 依次往左 这样左边的节点会在栈顶 这样下次…...
NFT系统开发:在数字荒原上播种「文明契约」
——解码下一代价值互联网的基础设施革命引言:当数字资产成为新大陆的「土地证」2025年,全球NFT市场规模突破870亿美元,从艺术收藏到房地产契约,从游戏道具到知识产权,NFT正在重构人类对"所有权"的认知。在物…...
AASM时间戳功能终极指南:自动记录状态变更时间的简单方法
AASM时间戳功能终极指南:自动记录状态变更时间的简单方法 【免费下载链接】aasm AASM - State machines for Ruby classes (plain Ruby, ActiveRecord, Mongoid, NoBrainer, Dynamoid) 项目地址: https://gitcode.com/gh_mirrors/aa/aasm AASM(Ru…...
Java实战:用Hutool和WGS84坐标系精准计算两点间距离与方位角(附避坑指南)
Java实战:用Hutool和WGS84坐标系精准计算两点间距离与方位角(附避坑指南) 在LBS(基于位置的服务)应用开发中,地理空间计算是核心能力之一。无论是外卖配送距离估算、共享单车调度优化,还是运动轨…...
Wan2.2-I2V-A14B企业级应用:私有化部署保障数据安全与合规
Wan2.2-I2V-A14B企业级应用:私有化部署保障数据安全与合规 1. 企业级文生视频解决方案概述 在当今内容创作领域,视频生成技术正成为企业数字化转型的关键工具。Wan2.2-I2V-A14B作为新一代文生视频模型,通过私有化部署方案为企业提供了安全可…...
别再手动画点了!用ArcGIS Pro的‘沿线生成点’工具,5分钟搞定街景采样点CSV
用ArcGIS Pro高效生成街景采样点的5个关键技巧 在数字化城市研究和街景分析中,获取均匀分布的采样点是基础但耗时的步骤。传统手动标注方法不仅效率低下,还容易引入人为误差。ArcGIS Pro的"沿线生成点"工具能自动化这一过程,但许多…...
车载协议栈调试还在printf?(2024最新eBPF+Uprobe嵌入式追踪方案,支持ARMv8-A硬浮点环境)
第一章:车载 C 协议栈调试车载协议栈(如 AUTOSAR CAN/LIN/FlexRay 或基于 SOME/IP、DoIP 的以太网协议栈)的调试具有强实时性、硬件耦合度高、日志受限等典型特征。在嵌入式 Linux 或 RTOS 环境中,C 实现的协议栈常需结合硬件抽象…...
告别重复造轮子:用快马生成高效配对模块提升开发效率
在开发智能硬件或物联网项目时,设备配对功能几乎是每个项目都绕不开的基础模块。但每次从零开始实现蓝牙、Wi-Fi等设备的配对逻辑时,总免不了要重复处理扫描过滤、状态管理、错误重试这些"轮子"。最近尝试用InsCode(快马)平台生成标准化配对模…...
如何通过Jellyfin Bangumi插件实现番剧元数据的精准管理
如何通过Jellyfin Bangumi插件实现番剧元数据的精准管理 【免费下载链接】jellyfin-plugin-bangumi bgm.tv plugin for jellyfin 项目地址: https://gitcode.com/gh_mirrors/je/jellyfin-plugin-bangumi 在数字媒体管理领域,番剧作为一种特殊的内容形式&…...
从‘RIP’这道题出发,聊聊IDA分析PWN题时新手常踩的3个坑(附正确姿势)
从‘RIP’这道题出发,聊聊IDA分析PWN题时新手常踩的3个坑(附正确姿势) 在CTF竞赛中,PWN题往往是最考验选手底层功力的题型之一。而作为静态分析利器的IDA Pro,虽然功能强大,但新手在使用过程中常常会陷入一…...
大模型学习笔记——SAM模型:从Prompt到分割的通用视觉框架
1. SAM模型:当视觉分割遇上NLP提示工程 第一次接触SAM模型时,我正被传统图像分割项目折磨得焦头烂额。需要为每个新场景重新标注数据、调整模型参数的日子,直到遇见这个"分割一切"的视觉大模型才彻底改变。SAM(Segment …...
