Skip to content

Anonimas cpp

RDLL edited this page Aug 10, 2023 · 7 revisions

Funciones anónimas

#include <iostream>

using namespace std;

int main() {
    int b = 10;
    int c = 100;
    auto f = [&](int& a) -> int {
        b += 1;
        c +=1;
        return a + b + c;
    };
    int a = 10;
    cout << f(a) << '\n';
    cout << b << '\n';
    cout << c << '\n';
    return 0;
}

Son pequeños fragmentos de código que se definen justo en la ubicación donde se invocan o se pasa como argumento de una función.

Síntaxis

[cláusula](parámetros) especificador requerimientos -> retorno {cuerpo}

Cláusula

Nos indica como se va a capturar el scope, por referencia & o por valor = o sin acceso [], así como si se capturara todo o solo lo que se especifique.

    int b = 10;
    int c = 100;
auto f = [&](int& a) -> int {
        b += 1;
        c +=1;
        return a + b + c;
    };
    int a = 10;
    cout << f(a) << '\n';

Aquí se captura todo el scope, por lo que la función puede tener acceso tanto a a como b, si lo definieramos de la siguiente manera, tendríamos un error al compilar ya que c no fue capturada.

    int b = 10;
    int c = 100;
auto f = [&b](int& a) -> int {
        b += 1;
        c +=1;
        return a + b + c;
    };
    int a = 10;
    cout << f(a) << '\n';

De igual manera si no definimos nada, también nos marcara un error al compilar, porque no se captura nada del scope.

    int b = 10;
    int c = 100;
auto f = [](int& a) -> int {
        b += 1;
        c +=1;
        return a + b + c;
    };
    int a = 10;
    cout << f(a) << '\n';

En el caso de mandar todo por valor, también tendríamos un error de compilación ya que b y c, son variables de solo lectura.

    int b = 10;
    int c = 100;
auto f = [=](int& a) -> int {
        b += 1;
        c +=1;
        return a + b + c;
    };
    int a = 10;
    cout << f(a) << '\n';

Parámetros

Al igual que cualquier función también tiene sus parámetros, recordar que el scope es todo lo que se encuentra antes de la declaración de la función, por lo que si hay algo que se encuentre fuera del scope y quisieramos usarlo, lo tendríamos que mandar como parámetro.

Por ejemplo si no ponemos a como parámetro tendremos un error de compilación tanto si la mandamos como si no la mandamos.

    int b = 10;
    int c = 100;
    auto f = []() -> int {
        b += 1;
        c +=1;
        return a + b + c;
    };
    int a = 10;
    cout << f() << '\n';

Especificador

Es una manera de indicar como deben ser tratados los datos, por ejemplo si mandamos parámetros por valor, con la palabra mutable es posible modificarlos, de igual manera podemos poner la palabra noexcept, que nos indica que la expresión no arroja excepciones.

Tipo de retorno

El tipo de retorno de ua función lambda es deducido automáticamente pero podemos definir el tipo de retorno con ->, lo podemos omitir si retornamos un solo parámetro o no retornamos ninguno. Sin embargo cuando tenemos lambdas de orden superior(lambdas que aceptan o retornan otras lambda), es neceario especificar el tipo de retorno.

Introducción Funciones Recursividad Macros