Sto tentando di creare una funzione generica wrapper che accetta una funzione come argomento modello e accetta gli stessi argomenti di quella funzione dei suoi argomenti. Ad esempio:Call wrapper con funzione C++ con funzione come argomento modello
template <typename F, F func>
/* return type of F */ wrapper(Ts... Args /* not sure how to get Ts*/)
{
// do stuff
auto ret = F(std::forward<Ts>(args)...);
// do some other stuff
return ret;
}
La soluzione deve essere colabile a un puntatore funzione con lo stesso tipo func
modo che possa passare ad un'api C. In altre parole, la soluzione deve essere una funzione e non un oggetto funzione. Ancora più importante, Devo essere in grado di lavorare nella funzione wrapper.
Se i commenti inline non sono chiare, mi piacerebbe essere in grado di fare qualcosa di simile al seguente:
struct c_api_interface {
int (*func_a)(int, int);
int (*func_b)(char, char, char);
};
int foo(int a, int b)
{
return a + b;
}
int bar(char a, char b, char c)
{
return a + b * c;
}
c_api_interface my_interface;
my_interface.func_a = wrapper<foo>;
my_interface.func_b = wrapper<bar>;
ho cercato related posts e trovato questi, ma nessuno di loro sono abbastanza quello Sto cercando di fare. La maggior parte di questi post riguarda oggetti funzionali. Quello che sto cercando di fare è anche possibile?
Function passed as template argument
Function wrapper via (function object) class (variadic) template
How does wrapping a function pointer and function object work in generic code?
How do I get the argument types of a function pointer in a variadic template class?
Generic functor for functions with any argument list
In risposta alle prime 2 risposte, ho modificato la domanda per chiarire che devo essere in grado di lavorare nella funzione wrapper (ad es. modificare alcune stato globale prima e dopo la chiamata alla funzione avvolto)
Grazie! Sto cambiando questo alla risposta accettata perché è più breve di @TC, usa solo una funzione e non una struct, usa 'std :: forward', e (per una questione di opinioni) è più facile da capire perché non lo hai fatto utilizzare la specializzazione degli argomenti del modello. – Eric
Anche se devo ammettere che std :: forward è solo lì perché ho provato qualcosa che sarebbe compilato sotto MSVC e poi ho pensato "ah fanculo, non succederà ... ma hey, mantieni l'avanti" ;-) – VolkerK
Cosa è il modo corretto per dichiarare un alias per il wrapper che sembrerà una normale funzione da chiamare? Qualcosa come "usando a_wrapped = wrapper;" (ma questo non funziona). –
eudoxos