Las plantillas (templates) en C++ y la programación genérica en C
En esta lección vas a escribir una función válida para varios tipos de datos con las plantillas de C++ y a compararla con _Generic de C11.
Introducción
Las plantillas (templates) permiten escribir un modelo de código genérico a partir del cual el compilador genera la versión adecuada para cada tipo de datos, garantizando la seguridad de tipos. En C se suelen usar macros, punteros void o la palabra clave _Generic de C11 para conseguir algo parecido.
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 max_int(int left, int right) {
return left > right ? left : right;
}
double max_double(double left, double right) {
return left > right ? left : right;
}
#define MAX(left, right) _Generic((left), \
int: max_int, double: max_double)((left), (right))
int main(void) {
printf("%d %.1f\n", MAX(3, 9), MAX(2.5, 7.0));
}
9 7.0
#include <iostream>
template<class T>
T maximum(const T& left, const T& right) {
return left > right ? left : right;
}
int main() {
std::cout << maximum(3, 9) << ' '
<< maximum(2.5, 7.0) << '\n';
}
9 7
Comparación entre C y C++
En C, la macro MAX usa _Generic para elegir max_int o max_double según el tipo del argumento, pero hay que enumerar de antemano cada tipo admitido. En C++, la plantilla maximum funciona con cualquier tipo que admita la comparación >, sin reescribir la función para cada tipo.
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.
- Máximo de un Arreglo Encuentra el valor más grande en una lista. Fácil
- Pila con mínimo Construye una pila que informe instantáneamente de su elemento más pequeño después de cualquier push o pop. Intermedio