YAML-CPP最简单的方式通过与不确定值的地图迭代(yaml-cpp Easiest way to

2019-06-28 05:46发布

我想获得一个地图的每个节点不知道钥匙。

我YAML看起来是这样的:

characterType :
 type1 :
  attribute1 : something
  attribute2 : something
 type2 :
  attribute1 : something
  attribute2 : something

我不知道这些键的名字有多少“式的” S将被宣布或将是什么。 这就是为什么我试图通过地图迭代。

struct CharacterType{
  std::string attribute1;
  std::string attribute2;
};

namespace YAML{
  template<>
  struct convert<CharacterType>{
    static bool decode(const Node& node, CharacterType& cType){ 
       cType.attribute1 = node["attribute1"].as<std::string>();
       cType.attribute2 = node["attribute2"].as<std::string>();
       return true;
    }
  };
}

---------------------
std::vector<CharacterType> cTypeList;

for(YAML::const_iterator it=node["characterType"].begin(); it != node["characterType"].end(); ++it){
   cTypeList.push_back(it->as<CharacterType>());
}

上面的代码不给编译时的任何麻烦,但随后在执行时,我得到这个错误:终止叫做抛出的一个实例后YAML::TypedBadConversion<CharacterType>

我已经使用分类指数,而不是迭代的,得到了​​同样的错误也试过。

我敢肯定,我做错了什么,我只是无法看到它。

Answer 1:

当通过一个地图,迭代器指向一个密钥/值对的节点,而不是一个单一的节点的迭代。 例如:

YAML::Node characterType = node["characterType"];
for(YAML::const_iterator it=characterType.begin();it != characterType.end();++it) {
   std::string key = it->first.as<std::string>();       // <- key
   cTypeList.push_back(it->second.as<CharacterType>()); // <- value
}

(你的代码编译,即使你的节点是图节点的原因是, YAML::Node有效地动态类型,所以它的迭代器有采取行动(静态)为两个序列的迭代器和地图迭代器)。



文章来源: yaml-cpp Easiest way to iterate through a map with undefined values
标签: c++ yaml-cpp