✅ Objetivo: Dominar el uso de conversiones en C++ (
static_cast,dynamic_cast,reinterpret_castyconst_cast), la serialización de punteros y la identificación de tipos en tiempo de ejecución sin RTTI. ✅ Nivel: Avanzado ✅ Temas clave:static_cast,reinterpret_cast,dynamic_cast,const_cast, parsing de literales, manejo de pseudo-literals, serialización de punteros, polimorfismo y detección de tipos sintypeid.
- Regla Adicional del Módulo
- Ejercicio 00 – ScalarConverter
- Ejercicio 01 – Serializer
- Ejercicio 02 – Identify real type
- Tabla Resumen de Casteos
- Errores Comunes
- Buenas Prácticas
📘 Obligatorio:
En cada ejercicio se debe de usar el cast específico indicado (static_cast, reinterpret_cast, dynamic_cast, etc.) para la conversión de tipos.
Cast usado: static_cast
Explicación:
Se detecta el tipo del literal (char, int, float, double) y se convierte explícitamente a los demás tipos escalares.
static_cast es apropiado porque:
- Funciona en tiempo de compilación para tipos compatibles.
- Realiza una conversión semántica, no reinterpretación de bits.
- Es seguro para conversiones numéricas y de tipos integrales a
char(controlando rangos).
Ejemplo:
int i = static_cast<int>(myDouble);
char c = static_cast<char>(i);Cast usado: reinterpret_cast
Explicación:
Convierte un puntero (Data*) a un entero sin signo (uintptr_t) y viceversa, sin alterar el contenido al que apunta.
reinterpret_cast es necesario porque:
- Permite reinterpretar la memoria sin conversión semántica, manteniendo los bits idénticos.
- No hay relación de herencia ni conversión numérica estándar.
- Es el cast habitual para serializar punteros.
Ejemplo:
uintptr_t raw = reinterpret_cast<uintptr_t>(ptr);
Data* ptr2 = reinterpret_cast<Data*>(raw);Cast usado: dynamic_cast
Explicación:
Permite detectar en tiempo de ejecución el tipo real de un objeto apuntado o referenciado como clase base (Base).
dynamic_cast es el más seguro porque:
- Funciona en jerarquías polimórficas con al menos un método
virtual. - Comprueba el tipo en tiempo de ejecución usando RTTI.
- Devuelve
nullptrsi falla en punteros y lanzastd::bad_casten referencias.
Ejemplo:
if (dynamic_cast<A*>(p)) std::cout << "A\n";| Ejercicio | Cast usado | Razón principal |
|---|---|---|
| 00 – ScalarConverter | static_cast |
Conversión semántica segura entre tipos escalares |
| 01 – Serializer | reinterpret_cast |
Reinterpretación de bits entre puntero y entero |
| 02 – Identify type | dynamic_cast |
Downcasting seguro en jerarquías polimórficas |
❌ Usar typeid o <typeinfo> (prohibido)
❌ No manejar pseudo-literals (nan, +inf, etc.) en ScalarConverter
❌ Olvidar virtual en el destructor de Base → comportamiento indefinido
❌ Usar un cast inadecuado (ej. reinterpret_cast en vez de static_cast)
✅ Elegir el cast más seguro posible para cada caso
✅ Documentar cada conversión explicando su necesidad
✅ Mantener ScalarConverter y Serializer como clases no instanciables
✅ Asegurar salida clara y formateada para todos los tipos
✅ Validar límites y conversiones imposibles antes de mostrar resultados
Este proyecto está bajo la licencia MIT.