Desidero assegnare l'indirizzo di una funzione a un puntatore di funzione, ma la funzione da indirizzare restituisce un puntatore a funzione con la stessa firma di se stesso, provocando il recurse in modo che non possa scrivere il tipo di ritorno, per il puntatore a funzione o anche la dichiarazione di funzione in sé ...Come scrivere un puntatore a una funzione che restituisce un puntatore a una funzione?
Credo che un modo di semplificare il problema quindi non è fonte di confusione:
Come potrei scrivere una dichiarazione di funzione tale che può restituire un puntatore a stesso (o qualsiasi altra funzione con la stessa firma)?
????? function(int a){
// could be this function, or another with the same signature,
return arbitraryFunction;
}
?????(*func)(int) = function; // same problem as above
edit:
Per ora ho una soluzione, anche se non posterò come una risposta, perché è aggressivo brutto. E si libera della ricorsione, semplicemente restituendo un void*
puntatore crudo come il tipo di ritorno, e finisce per prendere il seguente modulo:
void* function(int parameter){
return arbitraryFunction; // of the same signature
}
void*(*func)(int) = function;
func = reinterpret_cast<void*(*)(int)>(func(42)); // sin
EDIT2:
Sembra fusione tra puntatori a funzione e puntatori regolari è UB, quindi in questo caso non posso usare
Per rispondere a uno dei commenti, questo è per passare il controllo tra più loop "principali" nel mio programma, con ogni ciclo che ottiene la sua funzione. Ci sono molti modi per farlo, ma restituendo i puntatori di funzione (o NULL per terminare il programma) il mid-loop sembrava il come il metodo più semplice, ma non avevo previsto che i puntatori ai dati e i puntatori agli indirizzi di funzione sarebbero stati incomparabili insieme. Penso che restituire oggetti funzione polimorfici finirà per essere l'opzione più sensata in questo caso.
te immagino non posso farlo, almeno non facilmente. –
Mi chiedo se restituire 'void *' come tipo di ritorno del puntatore funzione e funzione, mi consentirà di evitare la dichiarazione ricorsiva ... –
BTW, anche Ocaml non lo consente, a meno che non si invochi 'ocamlc' con' -rectypes' (per * tipi ricorsivi *) –