Я хочу использовать 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, поскольку это последовательность.
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;
Других решений пока нет …