miércoles, 19 de noviembre de 2014

Más novedades en la depuración con ZinjaI

Ya les comentaba en otros posts que venía haciendo cambios importantes en ZinjaI para la próxima versión, y especialmente en lo relacionado a la depuración y el manejo de inspecciones. Y como algunos son cambios muy grandes, esta próxima versión se viene demorando bastante. Pero creo que la espera va a valer la pena, porque así como por un lado estos cambios son grandes y lentos de implementar, por el otro lado los resultados son especialmente útiles. Todo rediseño en las tripas de un software, si se hace después de un tiempo prudencial y de haber aprendido mucho de los errores (u ordenado más precisamente, de haber aprendido de muchos errores), facilita el trabajo futuro, permitiendo pensar en cosas que antes no eran posibles o requerían demasiado trabajo. Y les vengo a mostrar un ejemplo de eso, que parece bastante mágico si se lo mira desde el ángulo adecuado.

viernes, 14 de noviembre de 2014

SFINAE: Magia con templates en C++ (parte 3)

Finalmente llegamos a la última parte. Ya introduje en la parte 1 qué es eso de sfinae, y en la parte 2 cómo usarlo para consultar en tiempo de compilación la existencia de algo. La idea era poder plantear ejercicios de programación autocalificables; es decir, que validen solos si son correctos o no al ejecutarse. Para ello nos falta acomodar un poco el resultado de la parte 2 para que sea más cómodo de usar. Primero vamos a definir una macro para declarar con una linea la clase que hace la prueba de existencia de algo. Luego vamos a definir otra macro para declarar con una linea una función que solo se ejecuta si se pasa una prueba. Con todo eso, podemos plantear un ejercicio como el siguiente:

lunes, 10 de noviembre de 2014

SFINAE: Magia con templates en C++ (parte 2)

En la primer parte comenté cómo utilizar algunas reglas particulares de la especialización de funciones genéricas en C++ para permitir o no una determinada especialización de acuerdo a alguna característica de un tipo de dato. La clave estaba en que un argumento de la plantilla intentaba especializar otra plantilla con un entero que surgía de un sizeof. Si en esa otra plantilla fallaba la substitución, no se generaba un error mientras exista alguna otra plantilla en la que no falle. Cualquier cosa que acepte el sizeof nos sirve. Esto permite, por ejemplo, preguntar por la existencia de métodos o atributos, aplicándole el sizeof a un puntero al mismo. Y así, con pequeños podemos "controlar" varias cosas. Veamos cómo con una característica de C++11 lo generalizamos mejor, y con un par de lineas adicionales lo hacemos mucho más fácil de utilizar.

jueves, 6 de noviembre de 2014

SFINAE: Magia con templates en C++ (parte 1)

SFINAE son las iniciales de "Substitution Failire Is Not An Error" (un fallo en una substitución no es un error). Así se llama informalmente a un conjunto de situaciones muy particulares en C++, donde un error que resultaría de intentar especializar un template es ignorado silenciosamente durante la compilación. Si combinamos esto con los mecanismos de sobrecarga y resolución de nombres, podemos lograr cosas muy raras, como preguntar si una clase existe, si tiene cierto método, o si se puede usar de tal forma. Con algunos pocos trucos adicionales podemos tener código que se ejecute solamente si es válido, pero si no lo es (y esto es lo interesante) no genere errores de compilación, sino que utilice un camino alternativo. Llegué a esto tratando de armar ejercicios de programación que se califiquen a sí mismos (para hacer evaluación continua sin perder mucho tiempo de clases), y como el resultado es técnicamente muy interesante, aprovecho la excusa de siempre para documentarlo.