![]() |
![]() ![]() ![]() ![]() ![]() |
![]() |
Auto GeneratorBoost , Spirit 2.5.2 , Reference
|
Имя |
---|
< |
Notation
s
Переменный экземпляр любого типа, для которого определено отображение к типу генератора (мета-функция<traits::create_generator_exists
>возвращается<mpl::true_
>) илиЛенивый Аргумент, который оценивает к любому типу, для которого определено отображение к типу генератора (мета-функция<traits::create_generator_exists
>возвращается<mpl::true_
>).
Семантика выражения определяется только там, где она отличается от или не определена в<PrimitiveGenerator
>.
выражение |
Описание |
---|---|
< | Создать экземпляр генератора, совместимый с поставляемым типом атрибута, и использовать его для генерации выходных данных. Этот генератор никогда не выходит из строя (если основной выходной поток не сообщает об ошибке). |
< | Создать экземпляр генератора, совместимый с поставляемым буквальным значением. Этот генератор никогда не выходит из строя (если основной выходной поток не сообщает об ошибке). |
Генераторы<auto_
>могут использоваться для выделения выходных данных для любого типа данных, для которого определено отображение на тип генератора (метафункция<traits::create_generator_exists
>возвращает<mpl::true_
>). В следующей таблице излагаются заранее определенные правила отображения от типа атрибута к типу генератора. Эти правила применяются рекурсивно для создания типа генератора, который может быть использован для генерации выхода из данного типа атрибутов.
Тип атрибута |
Тип генератора |
---|---|
< | < |
< | < |
< | < |
< | < |
< | < |
< | < |
< | < |
Любая струна< | < |
Любой (STL) контейнер | Клин Звезда< |
Любая последовательность слияний | Оператор последовательностей< |
< | Факультативный оператор< |
< | Альтернативный оператор< |
Можно добавить поддержку любого пользовательского типа данных, реализовав специализацию точки настройки<traits::create_generator
>. Эта настройка может также использоваться для переопределения любого из предопределенных отображений.
выражение |
атрибут |
---|---|
< | < |
< | < |
![]() | Important |
---|---|
Тип атрибута< |
![]() | Note |
---|---|
В дополнение к их обычному атрибуту типа< |
Сложность генератора<
auto_
>зависит от типа атрибута. Каждый тип атрибута приводит к созданию другого типа генератора, который определяет общую сложность.
![]() | Note |
---|---|
Испытательный ремень для примера (примеров) ниже представлен в разделеОсновные примеры. |
Некоторые включают:
#include <boost/spirit/include/karma.hpp> #include <boost/spirit/include/support_utree.hpp> #include <boost/spirit/include/phoenix_core.hpp> #include <boost/spirit/include/phoenix_operator.hpp> #include <boost/fusion/include/std_pair.hpp> #include <iostream> #include <string>
Некоторые используют декларации:
using boost::spirit::karma::auto_;
Определение класса, используемое в примерах:
// a simple complex number representation z = a + bi struct complex { complex (double a, double b) : a(a), b(b) {} double a; double b; };
Для использования структуры данных<complex
>в качестве последовательностиBoost.Fusionтребуется следующая конструкция. Это необходимо, поскольку мы будем излучать выход для этой структуры данных с последовательностьюSpirit.Karma:<'{'
<<karma::double_<<','<<karma::double_<<'}'
>.
BOOST_FUSION_ADAPT_STRUCT( complex, (double, a) (double, b) )
Добавляем специализацию для точки настройки create_generator, определяющей пользовательский формат вывода для сложного типа. Как правило, любая специализация для create_generator должна возвращать выражение прото, которое будет использоваться для генерации вывода для типа, для которого была специализирована точка настройки.
Мы должны использовать<proto::deep_copy
>, так как выражение содержит буквы<'{'
>,<','
>и<'}'
>, которые обычно встраиваются в прото выражение только посредством ссылки. Глубокая копия преобразует прото-дерево, чтобы удерживать его по стоимости. Операция глубокой копии может быть исключена для более простых прото-выражений (не содержащих ссылок на временные периоды). В качестве альтернативы можно использовать средство<proto::make_expr
>для создания требуемого выражения прото.
namespace boost { namespace spirit { namespace traits { template <> struct create_generator<complex> { typedef proto::result_of::deep_copy< BOOST_TYPEOF('{' << karma::double_ << ',' << karma::double_ << '}') >::type type; static type call() { return proto::deep_copy( '{' << karma::double_ << ',' << karma::double_ << '}'); } }; }}}
Примеры использования генераторов<auto_
>:
Выберите простую строку с помощью генератора<karma::string
>:
test_generator_attr("abc", auto_, "abc"); test_generator("abc", auto_("abc"));
Выпустить экземпляры типа данных<complex
>, как определено выше, используя генератор, определенный точкой настройки для<complex
>:
test_generator_attr("{1.2,2.4}", auto_, complex(1.2, 2.4)); test_generator("{1.2,2.4}", auto_(complex(1.2, 2.4)));
Статья Auto Generator раздела Spirit 2.5.2 Reference может быть полезна для разработчиков на c++ и boost.
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.
реклама |