Udostępnij za pośrednictwem


Лямбда выражения теперь и в С++

 

Многие языки программирования позволяют создавать налету локальные не именованные функции внутри выражений. К этим языкам относятся C#3.0, Python, ECMAScript и практически все функциональные языки программирования (например, Haskell и Scheme). Такие функции обычно относят к лямбда функциям, которые имеют широкое применение.

C++0x– неофициальное название нового стандарта языка C++, который, как планируется, должен заменить существующий стандарт(ISO/IEC 14882), который был опубликован в 1998 и обновлен в  2003. Предшественники также известны, как C++98 и C++03. Новый стандарт добавит несколько дополнений в язык и расширит стандартную библиотеку C++. Одно из расширений языка – возможность использования лямбда выражений. Очень приятно, что уже сегодня данная возможность реализована для VisualStudio 2010 и GCC.

 

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

Напомню, функциональные объекты – это обыкновенные объекты с перегруженным“()”оператором. Таким образом, с точки зрения синтаксиса, они являются обыкновенными функциями.

Для начала давайте рассмотрим пример с использованием указателя на функцию. Представим, что нам нужно заполнить массив числами от 0 до 19, один из вариантов заполнения массива, используя текущий стандарт, приведен ниже.

 

 

Минус данного решения в том, что мы не можем отслеживать состояние нашей переменной “value” вне функции.

Теперь реализуем туже самую задачу с помощью функционального объекта. Вариант реализации приведен ниже.

 

Это техника прекрасно работает и позволяет отслеживать состояние переменной “n”, но она требует объявления класса.

А теперь давайте посмотрим, как просто можно выполнить ту же самую операцию, используя лямбда выражение.  

 

Синтаксис лямбда выражения :

 

1) Маска переменных

2) Список параметров

3) Изменение параметра, переданного по значению

4) Спецификация исключения

5) Возвращаемый тип

6) Тело лямбда выражения

 

Маска переменных

Лямбда выражение может получать доступ практически к любым переменным и использовать их внутри тела. Снимок определяет способ получения параметров телом  лямбда выражения. Доступ к переменным, перед которыми стоит амперсанд (&), осуществляется по ссылке, а перед которыми нет амперсанда, соответственно по значению. Пустая маска ([]) означает, что тело выражения не имеет доступа к переменным.

Стандартная маска определяет, получаем ли мы доступ к переменной по ссылке или же по значению.  Устанавливая “&”, все значения будут получены по ссылке. Используя же“=”, переменные будут получены по значению.  Например, если тело лямбда выражения получает доступ к внешней переменной “total” по ссылке и переменной “factor” по значению, маска должна быть записана следующим образом:

 

Также, вы можете использовать лямбда выражение внутри метода класса. Передавая указатель “this”, вы можете получить доступ к методам и членам данного класса.

Список параметров

Список параметров лямбда выражения содержит список параметров для функции, у которых существуют следующим ограничения:

1) Список параметров не может содержать значения по умолчанию

2) Не может содержать неименованные параметры

3) Ограниченное число параметров

 

Также лямбда выражение может принимать в качестве параметра другое лямбда выражение. С другой стороны, список параметров является опциональным элементов, и можно писать выражение, не включая его.

 

Изменение параметра переданного по значению

Спецификация позволяет разрешить телу лямбда выражения и заменить переменные, полученные по значению.

Спецификация исключений

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

Возвращаемый тип

Спецификация определяет возвращаемый тип лямбда выражения. Вы можете не использовать данную конструкцию, если тело выражения имеет только одну инструкцию “return” или не возвращает значения вообще. Если тело содержит только одну “return” инструкцию, компилятор установит возвращаемый тип лямбда выражения идентичный типу “return” инструкции.

Тело лямбда выражения

На тело выражения накладываются идентичные ограничения, как на блок кода или метод.

Данная фича уже доступна в VisualStudio 2010 и GCC, думаю, она вам поможет сделать ваш код еще лучше.

Comments

  • Anonymous
    July 30, 2009
    Совсем не удобно то, что код в виде картинок: фиг попробуешь :о(