![]() |
![]() ![]() ![]() ![]() ![]() |
![]() |
Number List - Printing Numbers From a std::vectorBoost , Spirit 2.5.2 , Tutorials
|
![]() | Note |
---|---|
Несмотря на то, что контейнер является параметром шаблона, Spirit.Karma форматирование выражения ( |
Разработанная выше система выпуска все еще не используется в общих чертах для всех типов контейнеров STL и для произвольных элементов, хранящихся в них. Для того, чтобы быть пригодными для использования, предметы, хранящиеся в контейнере, все еще должны быть конвертируемыми в ДП
. К счастью Spirit.Karma способен выдавать произвольные типы данных при использовании одного и того же выражения описания формата. Он реализует генераторы stream
, которые могут потреблять любой тип атрибутов до тех пор, пока определяется соответствующий стандартный потоковый оператор. I.e. для любого типа атрибутов Attrib
функция:
std::ostream& operator<< (std::ostream&, Attrib const&);
должен быть доступен. Генератор stream
будет использовать стандартный стриминговый оператор для генерации вывода.
Следующий пример модифицирует приведенный выше код для использования оператора stream
, что делает его совместимым практически с любым типом данных. Мы реализуем пользовательский тип данных комплекс
, чтобы продемонстрировать это. Пример показывает, как можно интегрировать этот (или любой другой) тип пользовательских данных в систему генераторов Spirit.Karma.
Это пользовательская структура данных вместе с требуемым стандартным потоковым оператором:
// a simple complex number representation z = a + bi struct complex { complex (double a, double b = 0.0) : a(a), b(b) {} double a; double b; }; // the streaming operator for the type complex std::ostream& operator<< (std::ostream& os, complex const& z) { os << "{" << z.a << "," << z.b << "}"; return os; }
И это фактический призыв к созданию выхода из вектора. На этот раз мы связываем сгенерированный выход с новыми перерывами (см. eol
), помещая каждый сложный номер на отдельную строку:
template <typename OutputIterator, typename Container> bool generate_numbers(OutputIterator& sink, Container const& v) { using boost::spirit::karma::stream; using boost::spirit::karma::generate; using boost::spirit::karma::eol; bool r = generate( sink, // destination: output iterator stream % eol, // the generator v // the data to output ); return r; }
Показанные коды являются полностью общими и могут использоваться с любым контейнером STL до тех пор, пока элементы данных, хранящиеся в этом контейнере, реализуют стандартный потоковый оператор.
Полный исходный код примера, представленного в этом разделе, можно найти здесь: num_list3.cpp.
Статья Number List - Printing Numbers From a std::vector раздела Spirit 2.5.2 Tutorials может быть полезна для разработчиков на c++ и boost.
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.
реклама |