Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
Разработка программного обеспечения

Number List - Printing Numbers From a std::vector

Boost , Spirit 2.5.2 , Tutorials

Boost C++ Libraries

...one of the most highly regarded and expertly designed C++ library projects in the world. Herb Sutter and Andrei Alexandrescu, C++ Coding Standards

PrevUpHomeNext
Using the List Operator

C++ Стандартной библиотеке не хватает важной функции, а именно поддержки любого отформатированного вывода контейнеров. Конечно, довольно легко написать пользовательскую рутину для выпуска конкретного контейнера, но делать это снова и снова является утомительным в лучшем случае. В этом разделе мы продемонстрируем еще несколько возможностей Spirit.Karma для получения продукции из произвольных контейнеров STL. Мы будем опираться на пример, представленный в предыдущем разделе (см. Warming Up).

Полный исходный код примера, показанного в этом разделе, можно найти здесь: num_list2.cpp.

На этот раз мы используем преимущества кармы List (%) оператора. Семантика оператора списка полностью эквивалентна семантике последовательности, которую мы использовали ранее. Выражение генератора

double_ << *(',' << double_)

семантически эквивалентно экспрессии генератора

double_ % ','

упрощение общего кода. Атрибут оператора списка совместим с любым контейнером STL. Для изменения мы используем std::vector<двойной> вместо std::лист<двойной> мы использовали раньше. Кроме того, рутина generate_ numbers берет контейнер в качестве параметра шаблона, поэтому теперь он будет работать с любым контейнером STL, удерживающим ДП.

template <typename OutputIterator, typename Container>
bool generate_numbers(OutputIterator& sink, Container const& v)
{
    using boost::spirit::karma::double_;
    using boost::spirit::karma::generate_delimited;
    using boost::spirit::ascii::space;
    bool r = generate_delimited(
        sink,                           // destination: output iterator
        double_ % ',',                  // the generator
        space,                          // the delimiter-generator
        v                               // the data to output 
    );
    return r;
}

[Note]Note

Несмотря на то, что контейнер является параметром шаблона, Spirit.Karma форматирование выражения (ДП_ % ",) не зависит от фактического типа переданного контейнера. Единственное предварительное условие, которое необходимо выполнить здесь, заключается в том, что элементы, хранящиеся в контейнере, должны быть конвертированы в ДП.

Generate Output from Arbitrary Data

Разработанная выше система выпуска все еще не используется в общих чертах для всех типов контейнеров 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.


PrevUpHomeNext

Статья Number List - Printing Numbers From a std::vector раздела Spirit 2.5.2 Tutorials может быть полезна для разработчиков на c++ и boost.




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.



:: Главная :: Tutorials ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-30 11:47:00
2025-05-19 20:35:43/0.029441118240356/1