View Full Version : [C++] Puntatori a funzioni differenti
Ciao ragazzi,
è possibile usare un puntatore a funzione con funzioni che prendono un numero diverso di argomenti?
Ad esempio:
funzione1(int)
funzione2(double,int)
sottovento
04-12-2008, 20:04
Perche' no? Si puo' sempre fare il cast di un puntatore da un tipo all'altro.
Il problema magari e' poi sapere se questo ha un senso... :D
typedef int (*ptrToFunc1Param)(int);
typedef int (*ptrToFunc2Param)(double, int);
ptrToFunc1Param p1;
ptrToFunc2Param p2;
p1 = (ptrToFunc1Param)p2;
e poi? Beh, sapendo com'e' organizzato lo stack per default (i.e. push e pop dei parametri attuali dal chiamante, push dei parametri in ordine inverso) potresti provare qualche giochetto "sporco". Poi pero' non piangere se va tutto in crash o se la portabilita' e' un'altra cosa ;)
Mm,meglio di no allora, troppo rischioso.
Ma se ad esempio definisco una funzione che prende un numero indefinito di parametri (ellissi) e poi un puntatore che punta ad essa?
E' fattibile?
sottovento
04-12-2008, 20:49
Beh, si. Ma mi sembra che il problema sia un altro e dipenda dal software che stai realizzando: in fase di chiamata della funzione, hai un semplice puntatore.
Hai un meccanismo per sapere quali e quanti parametri passare?
Immagino che per realizzare una soluzione del genere ti stia interfacciando a software gia' esistente (magari in C), ...
Scusa la banalita', ma nel caso tu stia invece progettando un software nuovo (in C++), prima di affrontare una simile soluzione prova a verificare se un semplice polimorfismo puo' fare al caso tuo. Anche se immagino ci avrai gia' pensato.
Beh, si. Ma mi sembra che il problema sia un altro e dipenda dal software che stai realizzando: in fase di chiamata della funzione, hai un semplice puntatore.
Hai un meccanismo per sapere quali e quanti parametri passare?
Immagino che per realizzare una soluzione del genere ti stia interfacciando a software gia' esistente (magari in C), ...
Scusa la banalita', ma nel caso tu stia invece progettando un software nuovo (in C++), prima di affrontare una simile soluzione prova a verificare se un semplice polimorfismo puo' fare al caso tuo. Anche se immagino ci avrai gia' pensato.
Si esatto, sto richiamando codice C già esistente. Il numero di parametri posso sapere quanti e quali sono, per ogni funzione. Quindi si può fare?
sottovento
05-12-2008, 07:31
Direi di si. Inoltre, visto che hai un meccanismo per sapere il numero di parametri (il loro tipo, anche?) allora puoi usare anche la soluzione precedente, qualcosa del genere:
void *p; // il tuo generico puntatore a funzione
int res;
...
switch (NumberOfParameters)
{
case 1:
{
ptrToFunc1Param p1 = (ptrToFunc1Param)p;
res = p1 (firstParameter);
}
break;
case 2:
{
ptrToFunc1Param p2 = (ptrToFunc2Param)p;
res = p2 (firstParameter, secondParameters);
}
break;
}
e cosi' via. Immagino che saprai far sicuramente meglio di questo codice.
Cmq direi che entrambe le soluzioni (questa o funzione con lista variabile di parametri) sono attuabili in quanto hai confermato che SAI quali e quanti argomenti passare....
sottovento: intendi accompagnare p con numero e tipo di parametri ? Allora direi tanto vale accompagnarla con una costante che identifica il tipo della funzione...
Qualcosa del tipo:
#define FUNCTION1 1
#define FUNCTION2 2
struct functionData
{
void *pointer;
int type;
};
Poi con uno switch su type si fa il cast come hai messo nel codice sopra.
Funziona, ma a me sembra un ragionamento alquanto contorto, cosa mi impedisce di chiamare direttamente la funzione senza il puntatore ? Ovviamente a meno che ci siano diverse funzioni con gli stessi parametri interscambiabili nel puntatore.
sottovento
05-12-2008, 11:25
Si. Cercavo di fare un discorso che fosse il piu' generico possibile... cmq da quel che ho capito Unrue ha gia' la soluzione, quale che sia, per esso.
A proposito della tua domanda: non conosciamo il problema.
La risposta che poi hai dato ha perfettamente senso e, per quel poco che ho imparato lavorando sul codice altrui, corrisponde al 90% dei casi ;)
Ok, grazie a tutti delle risposte :)
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.