Как получить узлы карты с ключами, а не скалярами?

Я хочу использовать yaml-cpp insensively в проекте C ++, так как он идеально соответствует моим потребностям. Но я хочу обновить один узел с другого узла, то есть правильно добавить несуществующие узлы из одного режима в другой или заменить существующие значения существующими. Я не могу найти, как это сделать просто с текущим интерфейсом …

Поэтому я пытаюсь сделать это с помощью простого цикла на итераторе. Я понял, что следующая вещь не работает при обходе узла карты:

if (node_1[it->first]) /*...*/

Не находит ни одного узла! Итак, для узлов карты со скалярами в качестве ключей, тест if (node_1[it->first.Scalar()]) /*...*/ работает хорошо. Моя проблема состоит в том, чтобы сделать то же самое с ключами последовательности. Как я могу это сделать?

РЕДАКТИРОВАТЬ

Вот пример документа YAML:

---
#Fake entry
Time:   0.1.1.2
ID: 25814
Emitter: Me
Line : {
orig: 314,
st: 512
}
Message : |
This is a fake error

#More difficult
[0,1,2,3] : my_address
[5, 6, 7, 8] : an_address
...

Этот документ загружается без проблем в узел, скажем, doc1; Теперь я хочу изменить некоторые записи относительно другого документа YAML, например:

---
Comment: what a dummy file!
Emitter: You
[0,1,2,3] : address changed
...

Поэтому я загружаю этот второй документ в Node doc2 и хочу обновить doc1 с помощью узлов doc 2. Первый ключ doc 2 отсутствует в doc 1 и является скалярным, так что я могу сделать doc1[it->first.Scalar()] = it->second, Второй ключ присутствует, поэтому эта же инструкция обновит doc1, заменив значение, связанное с ключом Emitter, Моя проблема в том, что я не могу найти третий ключ внутри doc1, поскольку это последовательность.

1

Решение

yaml-cpp не предлагает общего тестирования на равенство для узлов, поэтому ваше первоначальное решение (которое лучше всего подойдет) не сработало.

Вместо этого yaml-cpp полагается на набранный проверка на равенство. Например., node[5] преобразует все ключи в целые числа, чтобы проверить равенство ключей; это не будет конвертировать 5 к узлу, а затем проверить равенство таким образом. Вот почему ваше другое решение обычно будет работать — большинство ваших ключей являются простыми скалярами, поэтому они могут соответствовать, используя std::string равенство.

Похоже, вы действительно хотите «объединить» два узла; это было в списке проблем yaml-cpp некоторое время: https://code.google.com/p/yaml-cpp/issues/detail?id=41, и там есть некоторое обсуждение, которое объясняет, почему это сложная проблема.

В качестве возможного обходного пути, если вы знать тип каждого узла, который вы можете явно привести перед сравнением, например:

doc1[it->first.as<T>()] = it->second;
1

Другие решения

Других решений пока нет …

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