![]() |
![]() ![]() ![]() ![]() |
![]() |
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.
реклама |