2012-09-11 10 views
9

Haritadaki her düğümü, anahtarları bilmeden almak istiyorum.yaml-cpp Tanımlanmamış değerlerle bir harita üzerinde yineleme yapmanın en kolay yolu

Benim YAML şuna benzer: O anahtarların adı olacaktır kaç "tip" ler ilan edilecek ya da ne bilmiyorum

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

. İşte bu yüzden harita üzerinde yinelemeye çalışıyorum.

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

ancak derleme herhangi bir sorun vermez önceki kod sonra yürütme sırasında bu hatayı alıyorum: yerine Subindex ben de denedim YAML::TypedBadConversion<CharacterType>

bir örneğini atma sonra denilen sonlandırmak yineleyicinin aynı hatayı alıyorum.

Eminim yanlış bir şey yapıyorum, sadece göremiyorum.

cevap

15

Bir harita üzerinde yinelediğinizde yineleyici, tek bir düğümü değil, bir anahtar/değer çifti düğümünü gösterir. Örneğin: kodları düğüm bir harita düğümü olsa bile derlenmiş

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 
} 

(nedeni, YAML::Node etkili bir dinamik yazıldığından emin, bu yüzden onun yineleyici bir dizi hem gibi) statik olarak (hareket etmek zorundadır yineleyici ve bir harita yineleyici.)

+1

Sen bir hayat kurtarıcısın! Teşekkürler Jesse :) – delephin

+0

Biraz offtopic, ama tüm harita (YAML yapısı) bir dize olarak almak için bir yol olması güzel buluyorum, böyle bir olasılık belirtilir herhangi bir API belgesi bulmak için görünmüyor olabilir. – Smar

+0

Ayrıca değer boşsa, sanki boş dize döndürmek yerine bu hata ortaya çıkar ... – Smar

İlgili konular