Операторы ввода/вывода:<<<
>и<>>
>работают в общем на всех последовательностях Fusion. Операторы ввода/вывода перегружены в пространстве имен<boost::fusion
>
<operator<<
>было перегружено для общих выходных потоков таким образом, чтоПоследовательность(s) выводится рекурсивным вызовом<operator<<
>для каждого элемента. Аналогично, глобальный<operator>>
>был перегружен для извлеченияПоследовательности(s) из общих входных потоков путем рекурсивного вызова<operator>>
>для каждого элемента.
По умолчанию разграничителем между элементами является пространство, а последовательностьзаключена в скобки. Например:
vector
<float, int, std::string> a(1.0f, 2, std::string("Howdy folks!");
cout << a;
<vector
>как: (1.0 2 Привет, ребята!)
Библиотека определяет три манипулятора для изменения поведения по умолчанию:
Manipulators
tuple_open(arg)
Определяет символ, который выводится перед первым элементом.
tuple_close(arg)
Определяет символ, который выводится после последнего элемента.
tuple_delimiter(arg)
Определяет характер разграничителя между элементами.
Следовательно,<tuple_open
>,<tuple_close
>и<tuple_delimiter
>могут быть<char
>,<wchar_t
>, C-струна или широкая C-струна.
Пример:
std::cout << tuple_open('[') << tuple_close(']') << tuple_delimiter(", ") << a;
<vector
>,<a
>как: [1.0, 2, Привет, ребята!]
Те же манипуляторы работают и с<operator>>
>и<istream
>. Предположим, что<std::cin
>поток содержит следующие данные:
(1 2 3) [4:5]
Код:
vector
<int, int, int> i;
vector
<int, int> j;
std::cin >> i;
std::cin >> tuple_open('[') >> tuple_close(']') >> tuple_delimiter(':');
std::cin >> j;
<vector
>(s)<i
>и<j
>.
Обратите внимание, что извлечениепоследовательности(s) с<std::string
>или элементами строки в стиле C обычно не работает, поскольку представление потоковойпоследовательностине может быть однозначно разборчивым.
#include <boost/fusion/sequence/io.hpp>
#include <boost/fusion/include/io.hpp>