10 noviembre 2007

Metaprogramación en C++

No te acostarás sin descubrir alguna pirula nueva sobre programación.

Como todo el mundo debería saber, C++ incluye plantillas con las que puedes hacer estructuras de datos genéricas (por ejemplo listas) para luego utilizarlas con el tipo de datos que quieras sin tener que modificarla la plantilla (por ejemplo listas de enteros).

Hace unas semanas aprendí a hacer plantillas básicas para una clase que representa un autómata finito y no me pareció muy intuitivo lo de las plantilla.

Pues bien, el sistema de plantillas es tan potente y complejo (y difícil) que es capaz de simular un lenguaje de programación funcional (como haskell).

Se pueden crear expresiones funcionales con las plantillas, que se basen en el resultado de otras plantillas para crear expresiones más complejas (incluso recursivas). Como muestra un ejemplo que he visto por ahí en el que se define el factorial utilizando programación funcional en C++.


#include <iostream>
using namespace std;

template<int N>
class Factorial {
public: enum { value = N * Factorial<N-1>::value };
};

template<>
class Factorial<1> {
public: enum { value = 1 };
};

int main(int argc, char *argv[]) {
cout << Factorial<5>::value << endl;
return 0;
}


Este programa se compila con g++ y no da ningun problema. Se ejecuta y escribe por pantalla 120. Increíble.

Hay que ver las que cosas que se inventan...
Hay que ver lo pesado que es Ángel cuando cometes una o dos faltas de ortografía...