Google
 

martes, noviembre 28, 2006

Metaprogramación por medio de templates en C++

La metaprogramación es una técnica que permite programar usando trozos de código como si de datos se trataran. En lenguajes como Lisp es realmente fácil de llevar a cabo pero en C++ sólo se puede hacer mediante templates.

Podemos ver el compilador como una máquina virtual que produce código ensamblador. Esto nos permite hacer cálculos complejos en tiempo de compilación en lugar de en tiempo de ejecución. Un ejemplo muy usado es calcular un número de la sucesión de Fibonacci en tiempo de compilación:

1 #include <iostream>
2
3 template <int N> struct fib {
4 static const int result = fib<N-1>::result + fib<N-2>::result;
5 };
6
7 template <>
8 struct fib<0> {
9 static const int result = 0;
10 };
11
12 template <>
13 struct fib<1> {
14 static const int result = 1;
15 };
16
17 int main() {
18 std::cout << "Fib(15) = " << fib<15>::result << std::endl;
19 return 0;
20 }

En la wikipedia podemos encontrar una descripción un poco más extensa.

4 comentarios:

javi dijo...

Modern C++ design se dedica casi exclusivamente a ese tema. Está curioso, pero tiene poca utilidad real :/

FANatiko dijo...

Le echaré a un ojo a ese libro, que iba buscando algo mas de info al respecto.

Te aseguro javi que los templates pueden servirte para hacer un codigo altamente generico (sin cosas feas como void*). P.ej: boost (smart_ptr, un parser que escribes las reglas con templates, y tela de cosas mas)

lordgabriel dijo...

pues al menos solo pediria presentar algoritmos que sean eficientes, debido a q si hacen el analisis del costo computacional de la serie de fibonacci en forma recursiva no es nada eficiente, claro q no se nota mucho eso al ejecutar el programa en una computadora de estos tiempos... pero el objetivo de la programacion es llegar al punto de no meterse a un computador y escribir lo que a uno se le cruze por la cabeza, sino hacer un previo estudio del algoritmo a usar, disculpen por salirme del tema pero tenia que dejar en claro que no se caiga en un error tremendo como en este ejemplo de la serie de fibonacci recursivo

G@b®!eL

Jorge dijo...

No creo que javi diga que los templates no sean utiles. Metaprogramacion no es lo mismo que plantillas, es un uso que se le da a las plantillas.