2012-09-11 18 views
9

マップ内のすべてのノードをキーなしで取得したいと考えています。私が宣言されますどのように多くの「タイプ」Sまたはそれらのキーの名前がどうなるか分からないyaml-cpp未定義の値を持つマップを反復するもっとも簡単な方法

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

私のYAMLは次のようになります。だからこそ、私は地図を反復しようとしています。

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>

のインスタンスを投げた後に呼び出さ終了し、私はまた、代わりにサブインデックスを使用して試してみました同じエラーが発生します。

私は何か間違っていると確信しています、私はそれを見ることができません。

答えて

15

マップを反復処理するとき、イテレータは、単一のノードではなく、キーの値と値のペアを指します。例えば:あなたのコードは、あなたのノードがマップノードであっても、コンパイル

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が効果的に動的型付けされていることであるので、そのイテレータはシーケンスの両方として)静的に(行動することがありますイテレータとマップイテレータ)

+1

あなたは命の恩人です!ありがとうJesse :) – delephin

+0

少しずつ、しかし私は文字列として全体のマップ(YAML構造体)を取得する方法を持っていいと思います、私はそのような可能性が言及されているAPIドキュメントを見つけることができないようです。 – Smar

+0

また、空の文字列を返す代わりに、値が空の場合、このエラーが発生します... – Smar

関連する問題