Función Lambda en C++

Anam Javed 12 octubre 2023
  1. Sintaxis de la función Lambda en C++
  2. Implementar una función Lambda utilizando un puntero de función regular en C++
  3. Implementar una función Lambda usando std::function en C++
  4. Implementar una función Lambda usando auto en C++
  5. Usos de una función Lambda en C++
Función Lambda en C++

Este artículo discutirá la sintaxis y la implementación de las funciones de Lambda en C++ en detalle, junto con ejemplos relevantes.

En C++, las funciones Lambda o funciones anónimas se definen de forma anónima dentro de otra función. Está escrito en línea en el código fuente y se pasa como argumento a otra función que toma un objeto invocable.

Esto hace que la creación de funciones sea fácil y rápida para los programadores de C++. Estas funciones no tienen nombre y no se reutilizan.

Sintaxis de la función Lambda en C++

Sintaxis general:

[Capture List](Parameter List) { Function Body; }

La Lista de capturas le dice al compilador que se crea una función lambda.

Para usar cualquier variable dentro del cuerpo de la función, primero debemos capturarla dentro de la lista de captura. Sin hacerlo, estará fuera del alcance del cuerpo de la función.

Se puede acceder a la variable capturada como copia o como referencia. Capturar la variable no se considera pasar un argumento en una función normal.

Aquí, a se captura por valor:

auto f = [a]() { return a * 9; };

Y aquí, a se captura por referencia:

auto f = [&a]() { return a++; };

La Lista de parámetros, como sugiere el nombre, toma argumentos dentro de ella como una función normal. Es opcional escribir si no hay argumentos para pasar.

Con el ():

auto call_foo = [x]() { x.foo(); };

Sin el ():

auto call_foo2 = [x] { x.foo(); };

Ambas funciones lambda anteriores tienen el mismo significado.

El Cuerpo de la función contiene el código que se ejecutará como cualquier otra función regular.

int mul = 5;
auto ans = [mul](int a) { return a * mul; };
std::out << ans(2);

Producción :

5

Ejemplo de la función Lambda en C++:

#include <iostream>
#include <string>
using namespace std;

int main() {
  auto sum = [](int a, int b) { return a + b; };
  cout << "Sum of two integers:" << sum(5, 5) << endl;
  return 0;
}

Producción :

Sum of two integers: 10

Usamos la palabra clave auto para indicar que el tipo de datos del parámetro se determinaría en tiempo de ejecución. Esto se discutirá más en las siguientes secciones.

Implementar una función Lambda utilizando un puntero de función regular en C++

Podemos implementar una función lambda en C++ usando un puntero de función.

int main() {
  double (*addNum1)(double, double){[](double a, double b) { return (a + b); }};
  addNum1(1, 2);
}

Producción :

3

Aquí, *addNum1 es un puntero de función estándar que funciona solo con una cláusula de captura vacía. Después de eso, se declara el tipo de parámetros: double, double.

A esto se le llama prototipo de función. Puede observar una cláusula de captura vacía que indica que se crea una función Lambda para el compilador.

Además, se pasan dos variables en la lista de parámetros, double a y double b. Y, dentro del cuerpo de la función, se devuelve la suma de estas variables.

Después de cerrar la función principal, se llama a la función addNum(1,2) y devuelve 3 como salida.

Implementar una función Lambda usando std::function en C++

std::function addNum{[](double a, double b) { return (a + b); }};
addNumbers2(3, 4);

Producción :

7

El std::function pasa las funciones lambda como parámetros y valores de retorno. Le permite declarar los tipos exactos para la lista de argumentos y el valor devuelto en la plantilla.

Aquí, se pasan dos variables en la lista de parámetros, double a y double b. Y, dentro del cuerpo de la función, se devuelve la suma de estas variables.

Después de cerrar la función principal, se llama a la función addNum(1,2) y devuelve 7 como salida.

Implementar una función Lambda usando auto en C++

auto addNum{[](double a, double b) { return (a + b); }};
addNum(5, 6);
return 0;

Producción :

11

No podemos usar lambdas directamente ya que no tienen un tipo. Como resultado, cuando creamos una función lambda, el compilador construye un tipo único de parámetros.

Aunque no sabemos qué tipo de función lambda es, existen numerosos métodos para guardarla para su uso después de la definición. El único método para utilizar el tipo real de la lambda es a través de auto.

Las funciones Lambda se pueden usar en cualquier parte del programa C++ después de declararlo como auto.

Usos de una función Lambda en C++

Las expresiones lambda se usan comúnmente para encapsular algoritmos para pasarlos a otra función.

Una función lambda se puede ejecutar inmediatamente después de la definición: [ ](double a, double b).

{return (a + b)}();  // immediately executed lambda expression
{ return (a + b) }  // simple code block

Como podemos ver, las expresiones lambda son una herramienta eficaz para reestructurar funciones complicadas.

El proceso de parametrización explícita puede entonces llevarse a cabo paso a paso, con pruebas intermedias en el medio. Una vez que el bloque de código se haya parametrizado correctamente, reubiquelo en una ubicación externa y conviértalo en una función normal.

Las expresiones lambda también permiten crear funciones anidadas con nombre, lo que puede ayudar a eliminar la lógica innecesaria. Al dar una función no trivial como parámetro a otra función, usar lambdas con nombre es más fácil para los ojos.

auto algo = [&](double x, double m, double b) -> double { return mx + b; };
int l = algorithm(1, 2, 3), m = algorithm(4, 5, 6);
Nota
Lambdas también puede ser genérico y usarse para todos los tipos de datos.

Artículo relacionado - C++ Lambda