Pull to refresh

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

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

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

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

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

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

Минус данного решения в том, что мы не можем отслеживать состояние нашей переменной “value” вне функции.
Теперь реализуем туже самую задачу с помощью функционального объекта. Вариант реализации приведен ниже.
image
Это техника прекрасно работает и позволяет отслеживать состояние переменной “n”, но она требует объявления класса.

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

Синтаксис лямбда выражения:
image
1) Маска переменных
2) Список параметров
3) Изменение параметра, переданного по значению
4) Спецификация исключения
5) Возвращаемый тип
6) Тело лямбда выражения

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

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

Список параметров
Список параметров лямбда выражения содержит список параметров для функции, у которых существуют следующим ограничения:
1) Список параметров не может содержать значения по умолчанию
2) Не может содержать неименованные параметры
3) Ограниченное число параметров
image
Также лямбда выражение может принимать в качестве параметра другое лямбда выражение. С другой стороны, список параметров является опциональным элементов, и можно писать выражение, не включая его.
image
Изменение параметра переданного по значению
Спецификация позволяет разрешить телу лямбда выражения и заменить переменные, полученные по значению.
image
Спецификация исключений
Лямбда выражения может включать в себя спецификацию исключения, которая позволяет телу не создавать исключения.
image
Возвращаемый тип
Спецификация определяет возвращаемый тип лямбда выражения. Вы можете не использовать данную конструкцию, если тело выражения имеет только одну инструкцию “return” или не возвращает значения вообще. Если тело содержит только одну “return” инструкцию, компилятор установит возвращаемый тип лямбда выражения идентичный типу “return” инструкции.
image
Тело лямбда выражения
На тело выражения накладываются идентичные ограничения, как на блок кода или метод.

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

Articles