如何使用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
相关产品推荐
相关产品推荐

