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;
};
相关推荐
Escalating_xu7 分钟前
【C++ STL简介】从六大组件到容器、迭代器与算法协作
java·c++·算法
for_ever_love__11 分钟前
PySpark学习: 数据输出
开发语言·python·学习·spark
Brilliantwxx20 分钟前
【Linux】 进程(3)深度解析:从查看进程到进程状态
linux·服务器·网络·c++
言乐622 分钟前
Python实现自动拉人脚本示例
开发语言·windows·python·django·pygame
啊啊啊啊啊!!!!25 分钟前
【c++】二叉搜索树
开发语言·c++
归去来 兮43 分钟前
Python爬虫爬取数据案例
开发语言·爬虫·python
ShineWinsu1 小时前
对于 C++:C++20中Concept(概念) 与 Coroutine(协程)的解析
linux·开发语言·网络·c++·c++20·epoll
ly76891 小时前
C 语言从入门到进阶:语法、指针、内存管理与工程实践详解
c语言·开发语言
quantdash_cc1 小时前
历史数据断层与REST请求慢到崩溃?QuantDash高性能量化数据API终极解决方案
开发语言·python·缓存·php·量化·quantdash
breeze jiang1 小时前
Next.js 16 App Router 实战:从 About、Blog 动态路由到全局 404
开发语言·javascript·ecmascript