使用tomlplusplus遍历嵌套表(表数组)时遇编译错误求解决
解决tomlplusplus遍历表数组的编译错误
问题根源
你使用toml::array::for_each时,传入的lambda未明确处理数组内的toml::table类型,触发了tomlplusplus的静态断言检查——它要求访问器必须能处理至少一种node特化类型,直接输出元素的写法不符合要求。
正确遍历方式
方式一:用for_each配合类型检查
修改lambda逻辑,先将节点转换为toml::table再访问字段:
int main() { toml::table tbl; try { tbl = toml::parse_file("config.toml"); std::cout << tbl["data"] << '\n'; if(auto* data_array = tbl["data"].as_array()) { data_array->for_each([](auto&& node) { // 尝试将节点转换为table if(auto* sub_table = node.as_table()) { // 访问table中的name字段 if(auto name_val = sub_table->get<std::string>("name")) { std::cout << *name_val << '\n'; } } }); } } catch (const toml::parse_error& error) { std::cout << error << '\n'; } return 0; }
方式二:范围for循环(更直观)
利用tomlplusplus数组支持范围for的特性,直接遍历并转换元素:
int main() { toml::table tbl; try { tbl = toml::parse_file("config.toml"); std::cout << tbl["data"] << '\n'; if(auto* data_array = tbl["data"].as_array()) { for(auto&& node : *data_array) { if(auto* sub_table = node.as_table()) { std::cout << (*sub_table)["name"] << '\n'; } } } } catch (const toml::parse_error& error) { std::cout << error << '\n'; } return 0; }
关于is_array_of_tables()的使用
可以提前用这个函数判断目标节点是否为表数组,避免无效转换:
if(tbl["data"].is_array_of_tables()) { auto* data_array = tbl["data"].as_array(); // 执行遍历逻辑 }
内容的提问来源于stack exchange,提问作者Kevin
相关产品推荐
相关产品推荐

