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 originaltemplate <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 originalstatic void imprimir(arista<datoarista,datonodo>*& a)
{
cout<<a->dato;
}
La puedo invocar desde otro método de la misma clase
Código C++:
Ver originalvoid 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++:
Ver originaltemplate <typename T, typename D>
(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