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

Operator

Boost , Chapter 1. Phoenix 3.2.0 , Modules

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
#include <boost/phoenix/operator.hpp>

Этот объект обеспечивает механизм для ленивой оценки операторов. Как ни странно, ленивый оператор выглядит и ощущается как обычный C/C++-инфикс, префикс или постфикс-оператор. Приложение оператора выглядит одинаково. Однако, в отличие от обычных операторов, фактическое исполнение оператора откладывается. Образцы:

arg1 + arg2
1 + arg1 * arg2
1 / -arg1
arg1 < 150

Мы видели ленивых операторов в действии (см.Быстрый старт - ленивые операторы). Давайте вернемся и рассмотрим их немного дальше:

std::find_if(c.begin(), c.end(), arg1 % 2 == 1)

Посредством перегрузки оператора выражение<arg1 %2==1>фактически порождает актёра. Этот объект актера передается на функцию STL<find_if>. С точки зрения STL, выражение является просто функциональным объектом, ожидающим единственного аргумента контейнера value_type. Для каждого элемента в<c>элемент передается в качестве аргумента<arg1>актору (функциональному объекту). Актер проверяет, является ли это нечетным значением, основанным на выражении<arg1%2== 1>, где arg1 заменяется элементом контейнера.

Как и ленивые функции (см.Функция), ленивые операторы не сразу выполняются при вызове. Вместо этого создается и возвращается вызывающему объект (см.Актёр). Пример:

(arg1 + arg2) * arg3

Это не более чем возвращение актера. Вторая функция вызова будет оценивать реальных операторов. Пример:

std::cout << ((arg1 + arg2) * arg3)(4, 5, 6);

Распечатать «54».

Выражения оператора лениво оцениваются по четырем простым правилам:

  1. Бинарный оператор, за исключением<->*>, будет лениво оцениваться, когдапо крайней мереодин из его операндов является актерским объектом (см.Актёр).
  2. Унарные операторы лениво оцениваются, если их аргумент является действующим объектом.
  3. Оператор<->*>лениво оценивается, если левая рука аргумента является действующим объектом.
  4. Результатом ленивого оператора является актерский объект, который в свою очередь может допускать применение правил 1, 2 и 3.

Например, для проверки лениво оценивается следующее выражение:

-(arg1 + 3 + 6)
  1. Следуя правилу 1,<arg1+3>лениво оценивается, так как<arg1>является действующим лицом (см.Аргументы).
  2. Результатом этого<arg1+3>выражения является актёрский объект, следующий правилу 4.
  3. Далее<arg1+ 3+6>снова лениво оценивается. Правило 2.
  4. Согласно правилу 4, результат<arg1 +3+6>является объектом действия.
  5. Как<arg1+ 3+6>актер,<-(arg1+3+6)>лениво оценивается. Правило 2.

Применение ленивых операторов очень заразно. В большинстве случаев один<argN>актер заражает всех своих ближайших соседей внутри группы (первый уровень или скобчатое выражение).

Обратите внимание, что по крайней мере один операнд любого оператора должен быть действительным актером для ленивой оценки. Чтобы вынудить ленивую оценку обычного выражения, мы можем использовать<ref(x)>,<val(x)>или<cref(x)>для преобразования операнда в действительный объект актора (см.Ядро). Например:

1 << 3;      // Immediately evaluated
val(1) << 3; // Lazily evaluated
Supported operators
Unary operators
prefix:   ~, !, -, +, ++, --, & (reference), * (dereference)
postfix:  ++, --
Binary operators
=, [], +=, -=, *=, /=, %=, &=, |=, ^=, <<=, >>=
+, -, *, /, %, &, |, ^, <<, >>
==, !=, <, >, <=, >=
&&, ||, ->*
Ternary operator
if_else(c, a, b)

Трехсторонний оператор заслуживает особого упоминания. Поскольку C++ не позволяет перегрузить условное выражение:<c ?a:b>, для этой цели предусмотрена псевдофункция if_else. Поведение идентично, хотя и в ленивой манере.

Member pointer operator
a->*member_object_pointer
a->*member_function_pointer

Левая сторона оператора указателя участника должна быть актером, возвращающим тип указателя. Правая сторона оператора указателя члена может быть либо указателем на объект члена, либо указателем на функцию члена.

Если правая сторона является указателем объекта участника, результатом является актер, который при оценке возвращает ссылку на этого участника. Например:

struct A
{
    int member;
};
A* a = new A;
...
(arg1->*&A::member)(a); // returns member a->member

Если правая сторона является указателем функции участника, результатом является актер, который при вызове вызывает указанную функцию участника. Например:

struct A
{
    int func(int);
};
A* a = new A;
int i = 0;
(arg1->*&A::func)(arg2)(a, i); // returns a->func(i)
Include Files

Операторы

Файл

<->,<+>,<++>,<-->,<+=>,<-=>,<*=>,</=>,<%=>,<*>,</>,<%>

<#include<boost/phoenix/operator/arithmetic.hpp>>

<&=>,<|=>,<^=>,<<<=>,<>>=>,<&>,<|>,<^>,<<<>,<>>>

<#include<boost/phoenix/operator/bitwise.hpp>>

<==>,<!=>,<<>,<<=>,<>>,<>=>

<#include<boost/phoenix/operator/comparison.hpp>>

<<<>,<>>>

<#include<boost/phoenix/operator/io.hpp>>

<!>, &&,<||>

<#include<boost/phoenix/operator/logical.hpp>>

<&x>,<*p>,<=>,<[]>

<#include<boost/phoenix/operator/self.hpp>>

<if_else(c, a, b)>

<#include<boost/phoenix/operator/if_else.hpp>>

<->*>

<#include<boost/phoenix/operator/member.hpp>>


PrevUpHomeNext

Статья Operator раздела Chapter 1. Phoenix 3.2.0 Modules может быть полезна для разработчиков на c++ и boost.




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



:: Главная :: Modules ::


реклама


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

Время компиляции файла: 2024-08-30 11:47:00
2025-05-19 21:04:33/0.0099141597747803/1