2012-09-11 19 views
9

Tôi muốn nhận mọi nút trong bản đồ mà không cần biết các phím.yaml-cpp Cách dễ nhất để lặp qua bản đồ với các giá trị không xác định

My YAML trông như thế này:

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

Tôi không biết có bao nhiêu "loại" s sẽ được công bố hoặc những gì tên của những phím sẽ. Đó là lý do tại sao tôi đang cố gắng lặp lại thông qua bản đồ.

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

Đoạn mã trên không đưa ra bất cứ rắc rối khi biên dịch nhưng sau đó tại thời gian thực hiện tôi nhận được lỗi này: chấm dứt gọi là sau khi ném một thể hiện của YAML::TypedBadConversion<CharacterType>

Tôi cũng đã cố gắng sử dụng một subindex thay của trình lặp, nhận được cùng một lỗi.

Tôi chắc chắn tôi đang làm điều gì đó sai, tôi chỉ không thể nhìn thấy nó.

Trả lời

15

Khi bạn lặp qua bản đồ, trình vòng lặp trỏ đến một cặp khóa/giá trị của các nút, không phải là một nút duy nhất. Ví dụ:

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 
} 

(Các lý do rằng mã của bạn biên soạn, mặc dù nút của bạn là một nút bản đồ, là YAML::Node được hiệu quả tạo kiểu động, vì vậy iterator của nó có hành động (tĩnh) như cả một chuỗi trình lặp và trình lặp bản đồ.)

+1

Bạn là người tiết kiệm cuộc sống! Cảm ơn Jesse :) – delephin

+0

Một chút offtopic, nhưng tôi tìm thấy nó tốt đẹp để có một cách để có được toàn bộ bản đồ (YAML cấu trúc) ra như một chuỗi, tôi dường như không thể tìm thấy bất kỳ tài liệu API, nơi khả năng như vậy được đề cập. – Smar

+0

Cũng giống như nếu giá trị trống, lỗi này sẽ được nâng lên, thay vì trả về chuỗi trống ... – Smar

Các vấn đề liên quan