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
template <typename datonodo_t, typename datoarista_t> void Grafo<datonodo_t,datoarista_t>::recorrerHijos(pNodo& padre, void (*pfunc)(pArista& a)) { if (padre->adyacente!=0) { pArista A=padre->adyacente; while (A->siguiente!=0) { pfunc(A); A=A->siguiente; } pfunc(A); } }
Haciendo uso de una función miembro estática
Código C++:
Ver original
static void imprimir(arista<datoarista,datonodo>*& a) { cout<<a->dato; }
La puedo invocar desde otro método de la misma clase
Código C++:
Ver original
void Manejador::MostrarHijos() { G.recorrerHijos(padre, imprimir); }
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
(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++:
me podría ofrecer algo más de flexibilidad a la hora de su uso.Ver original
template <typename T, typename D> (T)(pfunc*)(D)
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