La risposta di dribeas è corretta per quanto riguarda il C++ moderno.
Per motivi di interesse, c'è anche una semplice soluzione lo-tech del mondo C che, per quanto possibile, funziona in C++. Invece di consentire parametri arbitrari, definire la funzione come void (*func)(void*)
e creare "parametri" void*
. È quindi compito del chiamante definire una struttura che conterrà i parametri e gestirne il ciclo di vita. In genere il chiamante potrebbe anche scrivere un semplice wrapper per la funzione che è davvero bisogno di essere chiamato:
void myfunc(int, float); // defined elsewhere
typedef struct {
int foo;
float bar;
} myfunc_params;
void myfunc_wrapper(void *p) {
myfunc_params *params = (myfunc_params *)p;
myfunc(params->foo, params->bar);
}
int main() {
myfunc_params x = {1, 2};
AddTimer(23, 5, myfunc_wrapper, &x);
sleep(23*5 + 1);
}
In pratica si vuole "spara e dimentica" timer, quindi se si utilizza questo schema si può anche bisogno di un modo perché il timer riesca a liberare il puntatore userdata una volta completati tutti gli spari.
Ovviamente questo ha limitato la sicurezza del tipo. In linea di principio non dovrebbe essere importante, perché chiunque fornisca il puntatore della funzione e il puntatore dei dati dell'utente non dovrebbe avere molte difficoltà a garantire che corrispondano. In pratica, naturalmente, le persone trovano modi per scrivere bug e modi per biasimarti perché il loro compilatore non ha detto loro dei bug ;-)
fonte
2011-01-29 16:28:18
chiamerà quindi solo prendere funzioni void? – Ninja
@Ninja Sì, certo. Come chiamante, se non sai nemmeno quale sia il tipo di ritorno, come puoi usare la funzione? Puoi usare la funzione 'boost ::' e trasmettere il tipo restituito a ciò che vuoi. Se si desidera un'alternativa C++ moderna, è possibile utilizzare la funzione 'boost :: ' per giocare con alcuni tipi di cancellazione. –
kizzx2