从表示我想从中检索数据的节点的路径的字符串开始,例如“a.b.c”。目前,我用于横向节点层次结构以到达该节点的代码看起来像这样(可能无法编译,但您明白了):
string keyPath("a.b.c");
vector<string> keyPieces(split(keyPath, "."));
const YAML::Node *currNode = &rootNode;
for_each(begin(keyPieces), end(keyPieces), [&](const string &key)
{
// for simplicity, ignore indexing on a possible scalar node
// and using a string index on a sequence node
if ((*currNode)[key])
{
currNode = &((*currNode)[key]);
}
});
// assuming a valid path, currNode should be pointing at the node
// described in the path (i.e. currNode is pointing at the "c" node)
上面的代码似乎工作正常,但我想知道是否有更好的方法来进行节点横向分配。使用直接节点分配(currNode = currNode[key]
)而不是(currNode = &((*currNode)[key])
)的指针/地址,似乎最终会在节点之间创建引用,而不是从一个节点转换到下一个节点。
是否有“更清洁”或更惯用的方式来实现这一目标?
答案 0 :(得分:1)
现在没有办法做到这一点(这是我没想过的用例),但这是一个好主意。我提交了一个错误(http://code.google.com/p/yaml-cpp/issues/detail?id=189)。
答案 1 :(得分:1)
我做了类似的事情,发现此功能是在前一段时间添加的,名为Node::reset()
所以,
string keyPath("a.b.c");
vector<string> keyPieces(split(keyPath, "."));
YAML::Node currNode = rootNode;
for_each(begin(keyPieces), end(keyPieces), [&](const string &key)
{
if (currNode[key])
{
currNode.reset(currNode[key]);
}
});
应按预期工作。