![]() |
![]() ![]() ![]() ![]() ![]() |
![]() |
Alternative Generator (a | b)Boost , Spirit 2.5.2 , Generator Operators
|
выражение |
Семантика |
---|---|
< | Генераторы< |
Альтернативы перехватывают и буферизируют выход исполняемого в настоящее время элемента. Это позволяет избежать частичных выходов из неисправных элементов, поскольку буферизованное содержимое будет перенаправлено на фактический выход только после того, как элемент преуспел.
См.Составные обозначения атрибутов.
выражение |
атрибут |
---|---|
< |
a: A, b: B --> (a | b): variant<A, B> a: A, b: Unused --> (a | b): A a: Unused, b: B --> (a | b): B a: Unused, b: Unused --> (a | b): Unused a: A, b: A --> (a | b): A
|
![]() | Important |
---|---|
Таблица выше использует< |
Обработка атрибутов Альтернатив является особенной, поскольку их поведение не полностью определяется во время компиляции. Прежде всего, выбранный альтернативный элемент зависит от фактического типа атрибута, подаваемого альтернативному генератору (т.е. от того, что хранится в варианте). Тип атрибута, поставляемый ввремя выполнения, сужает набор рассматриваемых альтернатив тем, которые являются совместимыми атрибутами. Остальные варианты испробованы последовательно, пока первый из них не увенчается успехом. Ниже приведен пример такого поведения.
Общая сложность альтернативного генератора определяется суммой сложностей его элементов. Сложность самой альтернативы — 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::ascii::string;
Базовое использование альтернативы. Будучи только второй альтернативой, генератор<double_
>выбирается для форматирования выходного сигнала, поскольку поставляемый тип атрибута не совместим (т.е. не конвертируем) с типом атрибута<string
>.
boost::variant<std::string, double> v1(1.0); test_generator_attr("1.0", string | double_, v1); test_generator_attr("2.0", string | double_, 2.0);
Те же правила форматирования могут быть использованы для вывода строки. На этот раз мы поставляем строку<"example"
>, в результате чего первая альтернатива будет выбрана для генерируемого вывода.
boost::variant<std::string, double> v2("example"); test_generator_attr("example", string | double_, v2); test_generator_attr("example", string | double_, "example");
Статья Alternative Generator (a | b) раздела Spirit 2.5.2 Generator Operators может быть полезна для разработчиков на c++ и boost.
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.
:: Главная :: Generator Operators ::
реклама |