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

Auto Generator

Boost , Spirit 2.5.2 , Reference

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
Description

Этот модуль содержит описание генератора<auto_>. Этот генератор можно использовать для автоматического создания генератора на основе поставляемого типа атрибута.

Header
// forwards to <boost/spirit/home/karma/auto.hpp>
#include <boost/spirit/include/karma_auto.hpp>

См. такжеВключите структуру.

Namespace

Имя

<boost::spirit::auto_// alias: boost::spirit::karma::auto_>

Model of

Notation

s

Переменный экземпляр любого типа, для которого определено отображение к типу генератора (мета-функция<traits::create_generator_exists>возвращается<mpl::true_>) илиЛенивый Аргумент, который оценивает к любому типу, для которого определено отображение к типу генератора (мета-функция<traits::create_generator_exists>возвращается<mpl::true_>).

Expression Semantics

Семантика выражения определяется только там, где она отличается от или не определена в<PrimitiveGenerator>.

выражение

Описание

<auto_>

Создать экземпляр генератора, совместимый с поставляемым типом атрибута, и использовать его для генерации выходных данных. Этот генератор никогда не выходит из строя (если основной выходной поток не сообщает об ошибке).

<auto_(s)>

Создать экземпляр генератора, совместимый с поставляемым буквальным значением. Этот генератор никогда не выходит из строя (если основной выходной поток не сообщает об ошибке).

Additional Requirements

Генераторы<auto_>могут использоваться для выделения выходных данных для любого типа данных, для которого определено отображение на тип генератора (метафункция<traits::create_generator_exists>возвращает<mpl::true_>). В следующей таблице излагаются заранее определенные правила отображения от типа атрибута к типу генератора. Эти правила применяются рекурсивно для создания типа генератора, который может быть использован для генерации выхода из данного типа атрибутов.

Тип атрибута

Тип генератора

<char>,<wchar_t>

<standard::char_>,<standard_wide::char_>

<short>,<int>,<long>

<short_>,<int_>,<long_>

<unsignedshort>,<unsignedint>,<unsignedlong>

<ushort_>,<uint_>,<ulong_>

<float>,<double>,<long double>

<float_>,<double_>,<long_double>

<short>,<int>,<long>

<short_>,<int_>,<long_>

<longlong>,<unsignedlong long>

<long_long>,<ulong_long>

<bool>

<bool_>

Любая струна<charconst*>,<std::string>и т. д.

<string>

Любой (STL) контейнер

Клин Звезда<'*'>

Любая последовательность слияний

Оператор последовательностей<'<<'>

<boost::optional<>>

Факультативный оператор<'-'>

<boost::variant<>>

Альтернативный оператор<'|'>

Можно добавить поддержку любого пользовательского типа данных, реализовав специализацию точки настройки<traits::create_generator>. Эта настройка может также использоваться для переопределения любого из предопределенных отображений.

Attributes

выражение

атрибут

<auto_>

<hold_any>, атрибут является обязательным (иначе компиляция не будет выполнена)

<auto_(s)>

<unused>

[Important]Important

Тип атрибута<hold_any>, представленный некоторыми генераторами<auto_>, семантически и синтаксически эквивалентен типу, реализованномуBoost.Any. Он был добавлен кДуху, поскольку он имеет лучшую производительность и меньший след по сравнению сBoost.Any.

[Note]Note

В дополнение к их обычному атрибуту типа<Attrib>все перечисленные генераторы также принимают экземпляр<boost::optional<Attrib>>. Если<boost::optional<>>инициализировано (имеет значение), генераторы ведут себя так, как если бы их атрибут был экземпляром<Attrib>и испускают значение, сохраненное в<boost::optional<>>. В противном случае генераторы не сработают.

Complexity

Сложность генератора<auto_>зависит от типа атрибута. Каждый тип атрибута приводит к созданию другого типа генератора, который определяет общую сложность.

Example
[Note]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)));


PrevUpHomeNext

Статья Auto Generator раздела Spirit 2.5.2 Reference может быть полезна для разработчиков на c++ и boost.




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



:: Главная :: Reference ::


реклама


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

Время компиляции файла: 2024-08-30 11:47:00
2025-05-20 09:38:13/0.0078608989715576/0