Ultimamente ho lavorato con libffi e, poiché utilizza un'API C, qualsiasi astrazione viene eseguita utilizzando i puntatori void (buon vecchio 'C). Sto creando una classe (con modelli variadic) che utilizza questa API. La dichiarazione della classe è la seguente: (dove Ret
= valore di ritorno e Args
argomenti = funzione)Modelli Variadic: iterare su tipo/argomento template
template <typename Ret, typename... Args>
class Function
All'interno di questa classe ho due diverse funzioni dichiarate come pure (semplificato):
Ret Call(Args... args); // Calls the wrapped function
void CallbackBind(Ret * ret, void * args[]); // The libffi callback function (it's actually static...)
voglio essere in grado di utilizzare Call
da CallbackBind
; e questo è il mio problema Non ho idea di come dovrei convertire l'array void*
nella lista degli argomenti basata su modelli. Questo è quello che voglio, più o meno:
CallbackBind(Ret * ret, void * args[])
{
// I want to somehow expand the array of void pointers and convert each
// one of them to the corresponding template type/argument. The length
// of the 'void*' vector equals sizeof...(Args) (variadic template argument count)
// Cast each of one of the pointers to their original type
*ret = Call(*((typeof(Args[0])*) args[0]), *((typeof(Args[1])*) args[1]), ... /* and so on */);
}
Se questo non è realizzabile, ci sono soluzioni alternative o soluzioni differenti disponibili?
C'è un motivo per cui non è possibile chiamare direttamente nell'API della libreria dal callback? Hai già un 'void *', e già lo prevede. –
Mmm perché dovresti chiamare una funzione modello variadica con una quantità fissa di argomenti? Sulla base del fatto che "la lunghezza di args è uguale a sizeof ... (Args)", allora conosci il numero di argomenti richiesti, perché usare i modelli variadici ?. – mfontanini
@MarkB Poiché 'CallbackBind' è chiamato _from_ API della libreria, sto cercando di chiamare la mia funzione che non usa i puntatori void. @mfontanini Voglio una classe che mima 'std :: function', e quindi ho bisogno di template variadici (come' operator() (Args ...) ') –