跳转至内容
  • 0 赞同
    5 帖子
    19 浏览
    dustchensD

    @SPeak
    按照这个思路,只保留一个列表初始化,用了一个辅助函数检测了每个元素是否是数组,如果是数组就检测长度是否是2,然后首元素是否是string,如果初始化列表里全部元素都符合就判定为object。这个代码运行成功了,感谢大佬

    Json(std::initializer_list<Json> init) { if (is_object_list(init)) { JsonObject dict; for (const auto &el : init) { auto pair = std::get_if<JsonArray>(&el.m_value); // 必须是长度为2的数组 assert(pair && pair->size() == 2); auto key = std::get_if<std::string>(&(*pair)[0].m_value); // 第一个元素必须是字符串 assert(key); dict.emplace(*key, (*pair)[1]); } m_value = std::move(dict); } else { m_value = JsonArray(init); } } bool is_object_list(std::initializer_list<Json> init) { return std::all_of(init.begin(), init.end(), [](const Json &el) { auto pair = std::get_if<JsonArray>(&el.m_value); if (!pair || pair->size() != 2) return false; return std::holds_alternative<std::string>((*pair)[0].m_value); }); }