qualcuno ha qualche idea piᅵ elegante al seguente problema riportato
nelle righe di commento di seguito (cosᅵ che possiate eventualmente fare
un copia incolla nel vostro editor preferito e avere il testo
sott'occhio)? In sostanza ho la necessitᅵ di legare un puntatore a
funzione a una funzione virtuale membro di una classe, nella maniera piᅵ
pulita possibile.
---
/*
* Si consideri un'interfaccia (non modificabile) fornita da una
* libreria C costituita da una struttura S cosᅵ definita:
*/
struct S {
void *o;
void (*callback)(S* p);
};
/* PROBLEMA:
* Avendo a disposizione questi due membri, vorrei trovare un modo
* elegante per legare S::callback() a una funzione membro virtuale f()
* di una classe astratta A da me definita, in modo tale che il
* comportamento di callback() sia determinato dinamicamente.
* Esiste una soluzione piᅵ elegante rispetto a quella
* che ho riportato nell'esempio che segue?
*/
#include <iostream.h>
/*
* Definisco la mia interfaccia come classe astratta.
*/
class A {
public:
virtual void f() = 0;
static void wrapper(S* p) {((A*)(p->o))->f();};
};
/*
* Definisco alcune classi derivate utili per l'esempio.
*/
class B : public A {
void f() {cout << "B::f() called\n";};
};
class C : public A {
void f() {cout << "C::f() called\n";};
};
S s;
A* a;
int main(int argc, char**argv) {
// collegamento dinamico
if (argc > 1)
a = new(B);
else
a = new(C);
// E altrove:
s.callback = A::wrapper;
s.o = a;
s.callback(&s); // comportamento dinamico
return 0;
}