![]() |
![]() ![]() ![]() ![]() ![]() |
![]() |
Plus Generator (+a)Boost , Spirit 2.5.2 , Generator Operators
|
выражение |
Семантика |
---|---|
| Генератор |
![]() | Note |
---|---|
Все неисправные итерации встроенного генератора будут потреблять один элемент из поставляемого атрибута. Общий |
См.Составные обозначения атрибутов.
выражение |
атрибут |
---|---|
|
a: A --> +a: vector<A> a: Unused --> +a: Unused
|
![]() | Important |
---|---|
В приведенной выше таблице используется |
Генератор Plus будет выполнять свой встроенный генератор один раз для каждого элемента в атрибуте предоставленного контейнера, пока встроенный генератор преуспевает. На каждой итерации он будет передавать следующий последовательный элемент из атрибута контейнера встроенному генератору. Поэтому количество итераций не будет больше количества элементов в контейнере, переданных в качестве его атрибута. Пустой контейнер приведет к отказу генератора плюс.
Важно отметить, что генератор плюс не выполняет никакой буферизации вывода, генерируемого его встроенными элементами. Это означает, что любой неисправный генератор элементов может уже генерировать некоторый выход, которыйнеоткатился назад.
![]() | Tip |
---|---|
Самый простой способ заставить генератор плюс вести себя так, как если бы он делал буферизацию, - это завернуть его в буферную директиву (см. buffer[+a] негенерируют какой-либо выход в случае выхода из строя генератора +(buffer[a]) Он не будет генерировать какой-либо частичный выход из генератора |
Общая сложность генератора плюс определяется сложностью его встроенного генератора, умноженной на количество выполненных итераций. Сложность самого генератора плюса — O(N), где N — количество элементов в контейнере, пропущенных в качестве его атрибута.
![]() | 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::space;
Базовое использование генератора плюс:
std::vector<double> v1; v1.push_back(1.0); v1.push_back(2.0); v1.push_back(3.0); test_generator_attr_delim("1.0 2.0 3.0 ", +double_, space, v1);
Более сложный вариант использования, показывающий, как использовать тот факт, что плюс выходит из строя для пустых контейнеров, переданных в качестве его атрибута:
std::vector<double> v2; // empty container test_generator_attr("empty", +double_ | "empty", v2);
Статья Plus Generator (+a) раздела Spirit 2.5.2 Generator Operators может быть полезна для разработчиков на c++ и boost.
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.
:: Главная :: Generator Operators ::
реклама |