Операторы ввода/вывода:<<<>и<>>>работают в общем на всех последовательностях 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>