2013-01-09 3 views
1

Я хотел бы вывести список значений строк для ostream.Вывод списка строк для ostream

я могу объявить и осуществить перегрузку функции для этого:

ostream& operator<< (ostream &out, const list<string> &in); 

... а потом писать, как

cout << value; 

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

Возможно ли изменение поведения демпинговых функций посредством управления потоком?

Я хотел бы написать что-то вроде:

list<string> lst; 
... 
cout << print_as_multiline() << lst; 

... и:

list<string> lst; 
... 
cout << print_as_one_line() << set_separator (", ") << lst; 
+4

Почему не просто 'std :: copy'? 'std :: ostream_iterator' позволяет вам контролировать, что между ними. – chris

+0

Как попытка лучшей удобочитаемости –

+0

строка заканчивается на нуль, для print_as_one_line вам нужно удалить '\ n' – billz

ответ

0

У меня есть идея ... Вы могли бы это проверить? У вашего оператора < < файл реализации Создать глобальный, статический? переменная строка Separator = def sep (",").

использовать его в < <, (и до возвращения сброса в Защиту SEP - ваше решение)

Создайте класс set_separator, с реализацией конструктора в том же файле, что и ваш < <. В этом конструкторе установите разделитель в аргумент.

Определить нового оператора < < для класса set_separator, ничего не делать, просто вернуть поток.

Похоже на многострочный выход.

0

Существует несколько вариантов: - Напишите несколько функций или функцию, взяв разделитель в качестве параметра. - Прикрепите разделитель к потоку. Вы можете использовать функцию iostream xalloc() для распределения пользовательского слота свойств (он должен быть выделен только один раз, а затем применяется ко всем потокам). Затем вы можете использовать функции потока iword() и pword() для доступа к прилагаемой информации. Существует также событие, в которое вы можете подключиться, так что пользовательская функция вызывается, когда, например, поток разрушен. Используйте это, чтобы выпустить динамически выделенный контент, если это необходимо. - Создайте так называемый фасет, который заботится о форматировании списка. Эта грань привязана к локали потока.

Советую: Возьмите первый вариант, это наименее сложный и самый простой. Если вам нужно решить форматирование в одном месте, но на самом деле использовать его в совершенно другом месте, используйте второй. Прочитайте Langer & Kreft C++ IOStreams и Locales, прежде чем рассматривать третий вариант. ;)

 Смежные вопросы

  • Нет связанных вопросов^_^