Las lambdas en C++ y el paso de contexto a los callbacks en C
En esta lección vas a usar las lambdas de C++ para llevar datos locales a un callback y a compararlo con el paso de contexto mediante un puntero void en C.
Introducción
Una lambda crea una función anónima en el mismo lugar donde se escribe y puede "capturar" (capture) las variables locales de alrededor para usarlas dentro. En C, un callback no puede llevar datos por sí solo, así que el contexto debe pasarse de forma explícita, normalmente con un puntero void.
Puntos importantes
- Entiende cómo se hace en C antes de aprender las abstracciones de C++.
- Expresa la propiedad de los recursos con RAII y la semántica de valor (value semantics).
- Usa las herramientas de C++ con seguridad de tipos en lugar de macros y conversiones de tipo.
Ejemplos de código C y C++
#include <stdio.h>
int above(int value, void *context) {
return value > *(int *)context;
}
int main(void) {
int values[] = {2, 7, 4, 9};
int threshold = 5;
int count = 0;
for (int index = 0; index < 4; ++index) {
count += above(values[index], &threshold);
}
printf("%d\n", count);
}
2
#include <algorithm>
#include <iostream>
#include <vector>
int main() {
std::vector values{2, 7, 4, 9};
int threshold = 5;
auto above = [threshold](int value) {
return value > threshold;
};
std::cout << std::count_if(values.begin(), values.end(), above)
<< '\n';
}
2
Comparación entre C y C++
La función above en C recibe el umbral a través del parámetro void *context y tiene que convertirlo a int * antes de comparar. En C++, la lambda captura la variable threshold por valor, así que conserva la información de tipo sin conversiones manuales. Los dos programas cuentan 2 valores mayores que 5.
C usa convenciones de nombres, callbacks, macros y struct de contexto.
C++ ofrece abstracciones con un alcance bien delimitado, con seguridad de tipos y normalmente sin coste adicional al ejecutar.
Ejercicios de práctica
Ejecuta las dos versiones y después modifica el código para ver la diferencia de seguridad que aporta cada lenguaje.
- Escribe primero el mecanismo en C y después usa la función equivalente de C++.
- Sustituye la liberación manual de recursos por RAII.
- Comprueba si la función provoca reservas de memoria o llamadas a funciones virtuales.
Practica con un reto
Usa lo que cubre esta lección para resolver un problema real. Cada reto se ejecuta en el navegador, con pruebas al instante y una revisión de IA.
Todos los retos