You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用std::initializer_list构造函数处理嵌套大括号初始化列表

实现支持嵌套大括号初始化的JSON类

我想实现一个类似nlohmann/json的JSON类,支持用嵌套大括号直接初始化,示例如下:

json j2 = {
  {"pi", 3.141},
  {"happy", true},
  {"name", "Niels"},
  {"nothing", nullptr},
  {"answer", {
    {"everything", 42}
  }},
  {"list", {1, 0, 2}},
  {"object", {
    {"currency", "USD"},
    {"value", 42.99}
  }}
};

该库无需显式指定JSON值类型,若要显式声明可使用json::array()和json::object()。

我尝试自行实现简化版但未成功:无法让std::initializer_list兼容多种类型,也不理解它如何处理嵌套大括号初始化列表。

判断规则

初始化列表表示JSONArray还是JSONMap的逻辑:

  • 若列表中每个嵌套元素都是长度为2的数组,且第一个元素可构造JSONString(可借助std::is_constructible_v<JSONString, T>判断)、第二个元素可构造JSONObject,则视为JSONMap;
  • 否则视为JSONArray。

我的代码尝试

我搭建了基础类结构,但核心初始化逻辑无法完成:

#include <iostream>
#include <vector>
#include <map>
#include <variant>

class JSONObject;

using JSONString = std::string;
using JSONNumber = double;
using JSONBool = bool;
using JSONNull = nullptr_t;
using JSONArray = std::vector<JSONObject>;
using JSONMap = std::map<std::string, JSONObject>;

class JSONObject {
    public:
        JSONObject() : var{JSONMap{}} {}

        template <typename T>
        JSONObject(std::initializer_list<T> list) {
            // 不知道如何实现
        }

    private:
        std::variant<JSONString, JSONNumber, JSONBool, JSONNull, JSONArray, JSONMap> var;
};

int main() {
    JSONObject jsonObj = {
        {"pi", 3.141},
        {"happy", true},
        {"name", "Niels"},
        {"nothing", nullptr},
        {"answer", {
            {"everything", 42}
        }},
        {"list", {1, 0, 2}},
        {"object", {
            {"currency", "USD"},
            {"value", 42.99}
        }}
    };

    return 0;
}

我还尝试过编写可变参数模板构造函数,但仍无法处理嵌套大括号:

template <typename... Args> 
JSONObject(Args&&... args) {
   // 借助折叠表达式推导变体构造方式
}

内容的提问来源于stack exchange,提问作者TheMemeMachine

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 06:33:32