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;
};
相关推荐
独隅2 分钟前
CLion 接入 Codex 的完整配置使用全面指南
c++·ide·ai·c++23
冻柠檬飞冰走茶5 分钟前
PTA基础编程题目集 7-34 通讯录的录入与显示(C语言实现)
c语言·开发语言·数据结构·算法
星核0penstarry19 分钟前
DeepSeek-V4-Flash 正式公测:大模型行业进入「极速平价普惠时代」
java·开发语言·人工智能
老洋葱Mr_Onion20 分钟前
【C++】高精度模板
开发语言·c++·算法
脚踏实地皮皮晨1 小时前
003003002_WPF Grid 基类官方类定义逐行深度解析
开发语言·windows·算法·c#·wpf·visual studio
xieliyu.1 小时前
Java 线程池入门详解:线程池基础定义 + ThreadPoolExecutor 全参构造方法逐参数解析
java·开发语言·idea·javaee
一条泥憨鱼1 小时前
【从0开始学习计算机网络】| HTTP方法疑点解析
开发语言·计算机网络·http
我不是懒洋洋2 小时前
从零实现一个分布式计算:MapReduce的核心设计
c++
微学AI10 小时前
一根针指向所有方向:挂谷猜想对 LLM Agent 技能-记忆架构的启示
开发语言·人工智能·架构·挂谷猜想
豆瓣鸡11 小时前
算法日记 - Day3
java·开发语言·算法