2012-09-11 7 views
9

Mi piacerebbe ottenere ogni nodo in una mappa senza conoscere i tasti.yaml-cpp Il modo più semplice per scorrere su una mappa con valori indefiniti

mio YAML si presenta così:

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

Non so quanti "tipo" s saranno dichiarati o quello che il nome di quelle chiavi sarà. Ecco perché sto cercando di scorrere la mappa.

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

Il codice precedente non dà alcun problema durante la compilazione, ma poi al momento dell'esecuzione ottengo questo errore: Termina chiamata dopo aver lanciato un'istanza di YAML::TypedBadConversion<CharacterType>

Ho anche provato con un sottoindice invece dell'iteratore, ottenendo lo stesso errore.

Sono sicuro che sto facendo qualcosa di sbagliato, proprio non riesco a vederlo.

risposta

15

Quando si esegue l'iterazione su una mappa, l'iteratore punta a una coppia chiave/valore di nodi, non a un singolo nodo. Per esempio:

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 
} 

(Il ragione che il codice compilato, anche se il nodo è un nodo mappa, è che YAML::Node è effettivamente dinamicamente tipizzato, per cui il suo iteratore deve agire (staticamente) sia come una sequenza iteratore e un iteratore di mappe.)

+1

Sei un risparmiatore di vita! Grazie Jesse :) – delephin

+0

Un po 'fuori dal comune, ma mi piacerebbe avere un modo per ottenere l'intera mappa (struttura YAML) come una stringa, non riesco a trovare alcun documento API in cui tale possibilità sia menzionata. – Smar

+0

Anche se il valore è vuoto, questo errore verrà generato, invece di restituire una stringa vuota ... – Smar

Problemi correlati