Ver Mensaje Individual
  #3 (permalink)  
Antiguo 06/02/2014, 06:24
Avatar de L3m0n
L3m0n
 
Fecha de Ingreso: diciembre-2011
Mensajes: 219
Antigüedad: 12 años, 4 meses
Puntos: 46
Respuesta: Punteros a plantillas de funciones...¿posible?

Buenas, supongo que con C++ habrá alguna manera mejor de hacer lo que voy a decir, sino será cuestión de investigar. Yo te voy a decir lo que haría yo en C:

La cosa es poner todos tus punteros a funciones en una union. Imagina que tienes dos funciones muy tontas: suma y doble. Pues harías algo así:
Código C:
Ver original
  1. typedef union
  2. {
  3.     int (*suma)(int a, int b);
  4.     int (*doble)(int a);
  5. }funciones;
Ahora, creas una union en el main o en la funcion que estés y le asignas la funcion que vayas a usar:
Código C:
Ver original
  1. funciones func;
  2.  
  3. if("quieres sumar")
  4.     func.suma = suma; //supon que tienes la funcion suma ya hecha
  5. else if("quieres usar el doble")
  6.     func.doble = doble;
Y ahora tienes que definir la funcion a la que mandas esto para que reciba una union:
Código C:
Ver original
  1. int funcion(funciones f);


O directamente puedes hacer la funcion para que segun una condicion que tu pases haga una cosa o otra:
Código C:
Ver original
  1. enum {SUMA = 1, DOBLE = 2};
  2.  
  3. int funcion(funciones f, int condicion)
  4. {
  5.      if(condicion == SUMA)
  6.            f.suma = suma;
  7.      else if(condicion == DOBLE)
  8.            f.doble = doble;
  9.  
  10.      // Y ahora llamas a la funcion:
  11.      return f.suma(2,3);
  12. }

Para finalizar te dire que hay una cosa bastante divertida a la que se le puede sacar bastante utilidad y es que aunque tu llames a la funcion f.suma, en realidad siempre se usara la ultima funcion que hayas asignado, así que si yo pongo f.suma pero la ultima que he asingnado ha sido doble, me usara la funcion doble.

Y hay una cosa aún mas "divertida", y es que aunque llames a la funcion
Código C:
Ver original
  1. f.suma(2,3);
Si tu lo ultimo que has definido ha sido doble, hara doble y lo bueno es que sin ningun problema, simplemente usara el primer argumento y del otro se olvidará, sin dar ningún problema.


Espero haber ayudado, aunque no sea C++, siempre sirve de algo xD