@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);
});
}