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

Generator Directives Consuming Attributes (omit[] and skip[])

Boost , Spirit 2.5.2 , Generator Directives

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

Директивы<omit[]>и<skip[]>потребляют тип атрибута встроенного генератора без создания какого-либо вывода. Директива<omit[]>будет по-прежнему выполнять встроенный генератор, отбрасывая сгенерированный выход. Директива<skip[]>не будет выполнять встроенный генератор, а будет использовать его только для извлечения открытого типа атрибута.

Header
// forwards to <boost/spirit/home/karma/directive/omit.hpp>
#include <boost/spirit/include/karma_omit.hpp>

Кроме того, см.Включите структуру.

Имя

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

boost::spirit::skip // alias: boost::spirit::karma::skip

Model of

Notation

a

Объект генератора

A

Тип генератора атрибутов<a>

Expression Semantics

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

выражение

Семантика

omit[a]

skip[a]

Attributes

См.Составные обозначения атрибутов.

выражение

атрибут

omit[a]

a: A --> omit[a]: A
a: Unused --> omit[a]: Unused

skip[a]

a: A --> skip[a]: A
a: Unused --> skip[a]: Unused

Complexity

Общая сложность директивы<omit[]>зависит от сложности встроенного генератора. Общая сложность директивы генератора<skip[]>составляет O(1), поскольку она не генерирует никакого вывода.

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::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[]>очень полезна, когда встроенный генератор вызывает побочные эффекты (имеет семантические действия, которые необходимо выполнить).


PrevUpHomeNext

Статья Generator Directives Consuming Attributes (omit[] and skip[]) раздела Spirit 2.5.2 Generator Directives может быть полезна для разработчиков на c++ и boost.




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



:: Главная :: Generator Directives ::


реклама


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

Время компиляции файла: 2024-08-30 11:47:00
2025-05-19 23:06:19/0.0094928741455078/1