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 originaltypedef union
{
int (*suma)(int a, int b);
int (*doble)(int a);
}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 originalfunciones func;
if("quieres sumar")
func.suma = suma; //supon que tienes la funcion suma ya hecha
else if("quieres usar el doble")
func.doble = doble;
Y ahora tienes que definir la funcion a la que mandas esto para que reciba una union:
O directamente puedes hacer la funcion para que segun una condicion que tu pases haga una cosa o otra:
Código C:
Ver originalenum {SUMA = 1, DOBLE = 2};
int funcion(funciones f, int condicion)
{
if(condicion == SUMA)
f.suma = suma;
else if(condicion == DOBLE)
f.doble = doble;
// Y ahora llamas a la funcion:
return f.suma(2,3);
}
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
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