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;
};
相关推荐
Wang's Blog4 小时前
Java框架 SpringCloud 快速入门: 网关的 CORS 跨域配置
java·开发语言·spring cloud
code2cat4 小时前
【随笔】MCP工具错误怎样分层:先读反馈,再决定下一步
开发语言·后端·ai agent·mcp
朝朝辞暮i4 小时前
C++ 第 36 课:Action——机械臂/VLA 非常重要
开发语言·c++·算法·ros2
无名猿4 小时前
锁进阶:atomic_flag 自旋锁、shared_mutex 读写锁与无锁的代价
c++·性能优化·并发编程·现代c++
谢亮_vipxieliang4 小时前
Go 接口设计原则核心知识点
开发语言·ios·golang
Wang's Blog4 小时前
Java框架 SpringCloud 快速入门: Feign 替代 RestTemplate 实现声明式远程调用
java·开发语言·spring cloud
谢亮_vipxieliang4 小时前
Go 结构体与方法集核心知识点
java·开发语言·golang
ra90fy4 小时前
B3873 [GESP202309 六级] 小杨买饮料
c++·算法
郝学胜-神的一滴4 小时前
Numpy数据处理详解 01:NumPy 从环境搭建到入门上手
开发语言·人工智能·python·程序人生·数据分析·numpy
尘客-追梦4 小时前
qmake / jom / 影子构建:把编译管起来
开发语言·c++·qt