C++ moderno y alternativas en C

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++

C
Ejecutar →
main.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));
}
Resultado de la ejecución
9 7.0
C++
Ejecutar →
main.cpp
#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';
}
Resultado de la ejecució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

C usa convenciones de nombres, callbacks, macros y struct de contexto.

C++

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