如何在遍历YAML::Node时使用C++结构化绑定简化代码?
解答
原生支持的精简写法
你想要的结构化绑定写法可以实现,对于map类型的YAML::Node,其迭代器返回值本身就是std::pair<YAML::Node, YAML::Node>,只要你使用C++17及以上编译标准,不需要任何额外改造就能直接用结构化绑定:
// C++17及以上直接可用 for (auto [key_node, value_node] : node) { std::string a = key_node.as<std::string>(); YAML::Node b = value_node; // 后续业务代码 }
这种写法已经比你原来的范围for精简很多,可读性也足够。
完全匹配你需求的实现
如果你要完全实现你示例中直接拿到std::string类型的a、不需要手动调用as方法的效果,可以加一层轻量的范围适配:
C++20版本(最简实现)
借助标准库的范围适配器即可:
#include <yaml-cpp/yaml.h> #include <string> #include <ranges> auto yaml_string_key_map(const YAML::Node& map_node) { return map_node | std::views::transform([](const auto& kv) { return std::make_pair(kv.first.as<std::string>(), kv.second); }); } // 使用方式和你写的完全一致 for (auto [a, b] : yaml_string_key_map(node)) { // a是已经转换好的std::string,b是YAML::Node类型的值 // 直接写业务逻辑即可 }
兼容C++17的版本
如果你的环境不支持C++20的范围库,也可以自己实现一个简单的迭代器包装类,重载operator*返回转换好的键值对即可,整体代码量也只有几十行。
注意事项
- 上述所有写法仅适用于map类型的YAML节点,使用前建议先调用
node.IsMap()做类型校验,避免运行时异常。 - 最低要求编译标准为C17,低于该版本的C标准本身不支持结构化绑定语法,无法实现需求。
内容的提问来源于stack exchange,提问作者Nejc Galof
相关产品推荐
相关产品推荐

