Лямбда-выражения на C++ с примерами

Лямбда-выражения C++Лямбда-выражение — это новейшая концепция C++.

Из этой статьи мы узнаем о лямбда-выражениях в C++. Мы также обсудим, как лямбда-выражения могут быть определены и использованы в программе.

Лямбда-выражения/функции

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

Мы можем объявить лямбда-выражения как «auto» и использовать их в любом месте программы.

Как использовать/писать лямбды?

Общий синтаксис определения лямбда-выражений следующий:

Capture closure (закрытие захвата): введение Lambda в соответствии со спецификацией C++.

Parameter list (список параметров): также называется лямбда-декларацией. Является необязательным и аналогичен списку параметров метода.

Mutable (изменяемый): необязательно. Позволяет изменять переменные, захваченные вызовом по значению.

Exception (исключение): спецификация исключения. По желанию. Используйте «noexcept», чтобы указать, что лямбда не генерирует исключение.

Return_type (тип_возврата): необязательно. Компилятор самостоятельно выводит возвращаемый тип выражения. Но по мере того, как лямбда-выражения становятся более сложными, лучше включать тип возвращаемого значения, поскольку компилятор может быть не в состоянии вывести тип возвращаемого значения.

Method definition (определение метода): тело лямбда.

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

Пустое закрытие захвата [ ] указывает на то, что лямбда-выражение не использует никакие переменные, что означает, что она может получить доступ только к переменным, которые являются локальными для нее.

Режим «capture-default» (захват по умолчанию) указывает, как захватывать внешние переменные, на которые ссылается лямбда:

  • Закрытие захвата [&] означает, что переменные захватываются по ссылке.
  • Закрытие захвата [=] указывает, что переменные захватываются по значению.

Если у нас есть условие захвата по умолчанию и предложение захвата, то у нас не может быть идентификатора в захвате этого конкретного захвата, который может иметь идентификатор &. Точно так же, если предложение захвата содержит параметр capture-default =, то предложение захвата не может иметь форму = идентификатор. Кроме того, идентификатор или «this» не может появляться в предложении захвата более одного раза.

Все станет более понятным из следующих примеров:

Здесь sum, sum_var и I — это переменные, которые нужно захватить и использовать в лямбда-выражении.

Ниже приведен базовый пример лямбда-выражения на C++:

Вывод данных:

Здесь у нас есть встроенное лямбда-выражение для вычисления суммы двух значений. Мы указали тип значений a и b как целые числа.

Одна проблема с приведенным выше кодом заключается в том, что он работает только для целых чисел. Если позже в программе мы захотим добавить два двойных числа, строки или любые другие типы, нам потребуется больше лямбда-выражений. Это неэффективный способ программирования.

Мы можем решить эту проблему, используя параметры шаблона. Это делает лямбды обобщенными для всех типов данных.

Таким образом, программа выше будет изменена следующим образом:

Вывод данных:

Таким образом, в этой программе мы использовали общую лямбда-сумму, которую можно использовать для нахождения суммы двух объектов любого типа. Обратите внимание, что мы использовали ключевое слово «auto», чтобы указать, что тип данных параметра будет выведен на основе данных.

Чтобы продемонстрировать использование этой лямбды, мы использовали ее с тремя различными типами данных: int, float и string. Из вывода данных видно, что в соответствии с типом данных выполняется операция суммирования. Например, когда мы передаем строковые параметры в лямбда-сумму, она объединяет две строки.

Итог

Мы подошли к концу данной статьи по лямбда-выражениям в C++. Это новейшая концепция в C++, и она может быть очень полезна, особенно, когда нам нужно выполнить небольшой фрагмент встроенного кода. Лямбды также можно сделать универсальными и использовать для всех типов данных.

В нашей следующей статье мы обсудим некоторые дополнительные темы в C++, такие как функции даты и времени, и конечно же, как всегда, приведем несколько примеров по их использованию.

С Уважением, МониторБанк

Добавить комментарий