C++17 联合体

两种风格的json如何解析更方便?------联合体哈希

(github有现成的json解析库;此文仅用于C++高级语法的学习)

json 复制代码
{
  "0x1": "a",
  "0x2": "b",
  "0x3": "c",
  "0x4": {
    "A": "d",
    "B": "e"
  },
  "0x5": {
    "A": "f",
    "B": "g",
    "C": "h"
  },
  "0x6": "i"
}

1. using ConfigNode= std::unordered_map<std::string, std::string>;

cpp 复制代码
// 等价于:
typedef std::unordered_map<std::string, std::string> ConfigNode;  // 旧式写法

2. using ConfigValue = std::variant<std::string, ConfigNode>;

定义另一个类型别名 ConfigValue,它代表 std::variant<std::string, SubConfig>

  • std::variant 是 C++17 引入的类型安全的联合体 (union)。它可以存储给定类型列表中的任意一种类型。
  • 这里 ConfigValue 的对象要么存一个 std::string,要么存一个 SubConfig(即 unordered_map)。不能同时存两者。

3. 为什么这样写?

在配置系统中,一个键对应的值可能有两种情况:

  • 直接是简单字符串(如 "a"
  • 或者是包含多个子键值对的"子映射"(如 {"A":"d", "B":"e"}

std::variant 完美表达了这种"或"的关系,而 using 让代码意图更清晰。

4.如果json有多层嵌套

cpp 复制代码
struct ConfigNode;
using ConfigValue = std::variant<std::string, std::unordered_map<std::string, std::shared_ptr<ConfigNode>>>;

struct ConfigNode {
    ConfigValue value;
};
相关推荐
AIFQuant2 分钟前
Python实时外汇行情接入实战:WebSocket与REST K线查询
开发语言·python·websocket
名字还没想好☜31 分钟前
Java NIO ByteBuffer 实战:flip/clear/compact 三个绕晕人的方法与 position/limit 心智模型
java·开发语言·后端·spring·nio
小溪学编程1 小时前
AQS 原理详解:从 CLH 队列到 ReentrantLock 的实现
java·开发语言
David猪大卫1 小时前
【C++修炼】哈希表的实现
数据结构·c++·笔记·学习·算法·哈希算法·散列表
持敬chijing1 小时前
Web前后端开发-JavaScript 入门教程
开发语言·前端·javascript
广州山泉婚姻1 小时前
列表初始化:C++11全新初始化体系
c++·人工智能
2601_966949651 小时前
从轮询到策略消费:量化系统如何高效处理五档盘口数据
开发语言·python·数据分析·pandas·量化交易·股票数据·quantdash
莫生灬灬1 小时前
灵码 LingBuilder:用中文写代码,确定性生成真实 C++ 工程(开源)
c++·开源·mfc
浅念-1 小时前
C++ Protobuf 入门实战:基于通讯录项目吃透proto3语法与序列化
linux·服务器·网络·c++·protobuf·proto·proto3
我命由我123452 小时前
人脸识别 - 去重时间窗口
java·开发语言·python·学习·java-ee·学习方法·python3.11