![]() |
![]() ![]() ![]() ![]() ![]() |
![]() |
Generator Directives Consuming Attributes (omit[] and skip[])Boost , Spirit 2.5.2 , Generator Directives
|
Имя |
---|
< |
boost::spirit::skip // alias:
boost::spirit::karma::skip |
Notation
a
Объект генератора
A
Тип генератора атрибутов<a
>
Семантика выражения определяется только там, где она отличается от или не определена в<UnaryGenerator
>.
выражение |
Семантика |
---|---|
omit[a] | |
skip[a] |
См.Составные обозначения атрибутов.
выражение |
атрибут |
---|---|
omit[a] | a: A --> omit[a]: A a: Unused --> omit[a]: Unused |
skip[a] | a: A --> skip[a]: A a: Unused --> skip[a]: Unused |
Общая сложность директивы<
omit[]
>зависит от сложности встроенного генератора. Общая сложность директивы генератора<skip[]
>составляет O(1), поскольку она не генерирует никакого вывода.
![]() | 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::double_; using boost::spirit::karma::omit;
Использование директивы генератора<omit
>. Он показывает, как он потребляет первый элемент предоставленного атрибута, не генерируя ничего, оставляя второй элемент атрибута необернутому<double_
>генератору.
std::pair<double, double> p (1.0, 2.0); test_generator_attr("2.0", omit[double_] << double_, p);
Как правило, эта директива полезна в ситуациях, когда тип атрибута содержит больше информации (элементов), чем необходимо для создания требуемого вывода. Обычно в таких ситуациях мы решаем использовать семантические действия, чтобы явно передать правильные части общего атрибута генераторам. Директива<omit
>помогает достичь того же самого без использования семантических действий.
Рассмотрим тип атрибута:
typedef fusion::vector<int, double, std::string> attribute_type;
где необходимо генерировать выход только из первого и последнего элемента:
typedef std::back_insert:iterator<std::string> iterator_type; karma::rule<iterator_type, attribute_type()> r; r = int_[_1 = phoenix::at_c<0>(_val)] << string[_1 = phoenix::at_c<2>(_val)]; std::string str; iterator_type sink(str); generate(sink, r, attribute_type(1, 2.0, "example")); // will generate: '1example'
Это ошибка предрасположенная и не совсем читаемая. То же самое можно сделать, используя директиву<omit
>:
r = int_ << omit[double_] << string;
Это в то же время более читабельно и более эффективно, поскольку нам не нужно использовать семантические действия.
Семантика использования директивы<skip[]
>идентична директиве<omit[]
>, за исключением того, что она фактически не выполняет встроенный генератор. По этой причине обычно предпочтительнее использовать директиву<skip[]
>вместо директивы<omit[]
>. С другой стороны, директива<omit[]
>очень полезна, когда встроенный генератор вызывает побочные эффекты (имеет семантические действия, которые необходимо выполнить).
Статья Generator Directives Consuming Attributes (omit[] and skip[]) раздела Spirit 2.5.2 Generator Directives может быть полезна для разработчиков на c++ и boost.
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.
:: Главная :: Generator Directives ::
реклама |