Идиоматический способ прохождения узлов по ссылке

Начиная со строки, представляющей путь к узлу, из которого я хочу получить данные, например, «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])), кажется, в конечном итоге создает ссылки между узлами вместо того, чтобы переходить от одного узла к другому.

Есть ли «чище» или более идиоматический способ сделать это?

3

Решение

Сейчас нет способа сделать это (это вариант использования, о котором я не думал), но это хорошая идея. Я подал ошибку (http://code.google.com/p/yaml-cpp/issues/detail?id=189).

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

должен работать как задумано.

1

По вопросам рекламы [email protected]