Alberto Bertogli, el 21 de agosto a las 23:34 me escribiste:
> On Tue, Aug 21, 2007 at 02:32:21PM -0300, Leandro Lucarella wrote:
> > Algo que empezó como una duda técnica ya se convirtió en una duda
> > existencial.
> > 
> > El problema original era lograr declarar un puntero a función que devuelva
> > un funtero a función con la misma firma en C (C++ en realidad, pero para
> > el caso es lo mismo). Es decir, necesitaría algo como una declaración
> > recursiva.
> 
> En esta pagina explican varias soluciones posibles, con sus ventajas y
> desventajas. Es bastante interesante =)
> 
> La pagina es http://www.gotw.ca/gotw/057.htm, espero que te sirva! ;)

Sí, me sirve (de hecho lo estaba usando también para implementar una
máquina de estados ;). Una solución que estaba tejiendo era justamente
usando un wrapper (inspirado por la propuesta de gonzalo), pero me
estaba haciendo lío porque estaba haciendo al revés, sobracargando el
operator() y usando void* como retorno, en vez de sobrecargar el operador
de cast y usar el wrapper como retorno.

Igual, aunque diga que la solución es portable y correcta, no deja de
ser un hack, un hack que no es transparente para el usaurio (que tiene
que poner que su función retorna una cosa extraña y que ni siquiera
anda en C :S

Acá dejo el ejemplo que puse yo implementado de esta forma, así queda
 para la posteridá:

------->8------->8------->8------->8------->8-------
#include <stdio.h>

struct func;
typedef func (*fp)();

struct func
{
        fp f;
        func(fp f): f(f) {}
        operator fp () { return f; }
};

func f1();
func f2();

func f1() { printf("f1()\n"); return &f2; }
func f2() { printf("f2()\n"); return &f1; }

int main()
{
        fp fp1 = f1();
        fp fp2 = fp1();
        fp fp3 = fp2();
        return 0;
}
-------8<-------8<-------8<-------8<-------8<-------

Gracias!

-- 
Leandro Lucarella (luca) | Blog colectivo: http://www.mazziblog.com.ar/blog/
 .------------------------------------------------------------------------,
  \  GPG: 5F5A8D05 // F8CD F9A7 BF00 5431 4145  104C 949E BFB6 5F5A 8D05 /
   '--------------------------------------------------------------------'
Hey you, out there in the cold
Getting lonely, getting old
Can you feel me?
_______________________________________________
Lista de correo Programacion.
[email protected]
http://listas.fi.uba.ar/mailman/listinfo/programacion

Responder a