Ver Mensaje Individual
  #1 (permalink)  
Antiguo 06/02/2014, 04:22
dehm
 
Fecha de Ingreso: septiembre-2010
Mensajes: 494
Antigüedad: 13 años, 7 meses
Puntos: 10
Punteros a plantillas de funciones...¿posible?

Bueno, sigo con otro capítulo de mi culebrón:

Cap 1
Cap 2

Una vez aprendido a manejarme con punteros a funciones, punteros a métodos de clase y punteros a métodos de instancias, sigo sin tener claro cómo hacer uso de ellos de forma flexible y conseguir que me sirvan para varias cosas diferentes.

Me explico:

parto de esté método de una clase que representa a un grafo:
Código C++:
Ver original
  1. template <typename datonodo_t, typename datoarista_t>
  2. void Grafo<datonodo_t,datoarista_t>::recorrerHijos(pNodo& padre, void (*pfunc)(pArista& a))
  3. {
  4.     if (padre->adyacente!=0)
  5.         {
  6.             pArista A=padre->adyacente;
  7.              while (A->siguiente!=0)
  8.                 {
  9.                     pfunc(A);
  10.                     A=A->siguiente;
  11.                 }
  12.             pfunc(A);
  13.         }
  14. }

Haciendo uso de una función miembro estática

Código C++:
Ver original
  1. static void imprimir(arista<datoarista,datonodo>*& a)
  2. {
  3.      cout<<a->dato;
  4. }

La puedo invocar desde otro método de la misma clase
Código C++:
Ver original
  1. void Manejador::MostrarHijos()
  2. {
  3.    G.recorrerHijos(padre, imprimir);
  4.  }


Pero a este sistema le veo una limitación (aparte de mi ) y es que estoy obligado a crear todas las funciones con la firma:
Código C++:
Ver original
  1. (void)(pfunc*)(arista<datoarista,datonodo>*& a)

Supongamos que ahora quiero usar la misma función que recorre los hijos directos de un nodo, pero para comparar sus valores.....pues ya no me sirve esa forma, o al menos no encuentro la manera de hacerlo.

Entonces se me ocurre que tal vez, si la firma de la función fuera una plantilla, algo como:
Código C++:
Ver original
  1. template <typename T, typename D>
  2. (T)(pfunc*)(D)
me podría ofrecer algo más de flexibilidad a la hora de su uso.
Pero no se me ocurre cómo implementarlo.

Por otro lado, he leído algo sobre functores, pero igualmente no sé como podría implementarlo en mi caso.

En fin, que como siempre, cualquier ayuda será agradecida