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