文件test.yaml .....
---
map:
? [L, itsy] : ISO_LOW_ITSY(out, in, ctrl)
? [L, bitsy] : ISO_LOW_BITSY(out, in, ctrl)
? [L, spider] : ISO_LOW_SPIDER(out, in, ctrl)
? [H, ANY] : ISO_HIGH(out, in, ctrl)
使用yaml-cpp可以使用什么命令来访问其中一个命令。我可以作为一个整体访问地图,但不能访问单个元素。
这是我正在尝试的:
YAML::Node doc = YAML::LoadFile("test.yaml");
std::cout << "A:" << doc["mapping"] << std::endl;
std::cout << "LS1:" << doc["mapping"]["[L, spider]"] << std::endl;
std::cout << "LS2:" << doc["mapping"]["L", "spider"] << std::endl;
以下是我的结果:
A:? ? - L
- itsy
: ISO_LOW_ITSY(out, in, ctrl)
: ~
? ? - L
- bitsy
: ISO_LOW_BITSY(out, in, ctrl)
: ~
? ? - L
- spider
: ISO_LOW_SPIDER(out, in, ctrl)
: ~
? ? - H
- ANY
: ISO_HIGH(out, in, ctrl)
: ~
LS1:
LS2:
如果在yaml-cpp中尚不可能,我也想知道。
答案 0 :(得分:1)
您必须定义与您的密钥匹配的类型。例如,如果您的密钥是两个标量的序列:
struct Key {
std::string a, b;
Key(std::string A="", std::string B=""): a(A), b(B) {}
bool operator==(const Key& rhs) const {
return a == rhs.a && b == rhs.b;
}
};
namespace YAML {
template<>
struct convert<Key> {
static Node encode(const Key& rhs) {
Node node;
node.push_back(rhs.a);
node.push_back(rhs.b);
return node;
}
static bool decode(const Node& node, Key& rhs) {
if(!node.IsSequence() || node.size() != 2)
return false;
rhs.a = node[0].as<std::string>();
rhs.b = node[1].as<std::string>();
return true;
}
};
}
然后,如果您的YAML文件是
? [foo, bar]
: some value
你可以写:
YAML::Node doc = YAML::LoadFile("test.yaml");
std::cout << doc[Key("foo", "bar")]; // prints "some value"
我认为你的YAML不符合你的意图。在块上下文中,显式键/值对必须位于单独的行上。换句话说,你应该做
? [L, itsy]
: ISO_LOW_ITSY(out, in, ctrl)
和不
? [L, itsy] : ISO_LOW_ITSY(out, in, ctrl)
后者使它成为单个键,具有(隐式)空值;即,它与
相同? [L, itsy] : ISO_LOW_ITSY(out, in, ctrl)
: ~
(你可以通过yaml-cpp如何输出你的例子来看到这一点。)见the relevant area in the spec。