Эта проблема является самой большой ошибкой в библиотеке iostream.
Решение Джеймса Канзе является частичным, которое будет работать в ваших собственных классах, но в целом объектам предоставляется особый способ потоковой передачи.
Мое обычное средство - создать мой собственный класс-обертку с функцией, которую вы можете передать в свой поток, а с помощью xml будет содержать перегрузки до xml_node()
или xml_attribute()
, например
os << xml_attribute( "Id", id );
установит для атрибута Id значение, указанное в переменной в формате xml.
Я также написал области видимости узлов, чтобы они писали в потоковом режиме текст, открывающий узлы при построении, и автоматически записывали логику закрытия при разрушении.
Преимущество моего метода перед решением Джеймса Канзев том, что это расширяемое.Я думаю, что заключительный комментарий Джеймса Канзе говорит о том, что он не одобряет свое решение и, вероятно, будет использовать что-то более похожее на мое.
С решением выше, чтобы добавить больше форматов, вы должны отредактировать оператор << функции всев то время как кодирование в формате json будет представлять собой совершенно другой набор функций, и если вы добавите еще один формат, вы добавите код для него без необходимости редактирования какого-либо существующего кода. </p>
Между прочим, для вводадля XML вы бы использовали существующий синтаксический анализатор DOM или SAX и не использовали бы iostream напрямую таким образом.