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

Lazy Operators

Boost , Chapter 1. Phoenix 3.2.0 , Starter Kit

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

Вы можете использовать обычный набор операторов для формирования выражений. Примеры:

arg1 * arg1
ref(x) = arg1 + ref(z)
arg1 = arg2 + (3 * arg3)
ref(x) = arg1[arg2] // assuming arg1 is indexable and arg2 is a valid index

Обратите внимание на выражение 3 * arg3. Это выражение на самом деле является краткосрочным эквивалентом: val(3) * arg3. В большинстве случаев, как и выше, вы можете избежать его. Но в некоторых случаях вам придется явно обернуть свои ценности в val. Правила большого пальца:

  • В бинарном выражении (например, 3 * arg3), по крайней мере, одна из операнд должна быть феникс примитивной или экспрессией.
  • В неарочном выражении (например, arg1++) один операнд должен быть феникс примитивным или выражением.

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

ref(x) = 123    // lazy
x = 123         // immediate
ref(x)[0]       // lazy
x[0]            // immediate
ref(x)[ref(i)]  // lazy
ref(x)[i]       // lazy (equivalent to ref(x)[val(i)])
x[ref(i)]       // illegal (x is not a phoenix primitive or expression)
ref(x[ref(i)])  // illegal (x is not a phoenix primitive or expression)

Почему последние два выражения являются незаконными? Хотя оператор[] выглядит так же, как бинарный оператор, как оператор= над ним; разница в том, что первый должен быть членом (т.е. x должен иметь оператор[], который принимает феникс примитивный или экспрессию в качестве своего аргумента). Это, скорее всего, не так.

First Practical Example

Мы накрыли достаточно оснований, чтобы показать реальный мировой пример. Мы хотим найти первый нечетный номер в контейнере STL. Обычно мы используем фанктор (объект функции) или указатель функции и передаем это в STL's find_if родовая функция:

Написать функцию:

bool
is_odd(int arg1)
{
    return arg1 % 2 == 1;
}

Передайте указателю на функцию STL's find_if алгоритм:

std::find_if(c.begin(), c.end(), &is_odd)

Используя Феникс, то же самое можно достичь непосредственно с однолинейным:

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

Выражение arg1 % 2 == 1 автоматически создает фанктор с ожидаемым поведением. В FP эта неназванная функция называется функцией lambda. В отличие от версии указателя функции, которая является мономорфной (ожидается и работает только с аргументом фиксированного типа int), версия Феникса полностью полиморфна и работает с любым контейнером (внутренний, большой и т.д.) до тех пор, пока его элементы могут обрабатывать выражение arg1 % 2 == 1.

(См. find_if.cpp)


PrevUpHomeNext

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




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



:: Главная :: Starter Kit ::


реклама


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

Время компиляции файла: 2024-08-30 11:47:00
2025-05-19 20:09:44/0.011677980422974/1