Ich versuche, eine generische Wrapperfunktion zu erstellen, die eine Funktion als Vorlageargument übernimmt und dieselben Argumente wie diese Funktion als Argumente verwendet. Zum Beispiel:C++ - Funktionsaufruf-Wrapper mit Funktion als Vorlageargument
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;
}
Die Lösung muss gießbaren auf einen Funktionszeiger mit dem gleichen Typ wie func
sein, so dass ich es an einen C api passieren kann. Mit anderen Worten, die Lösung muss eine Funktion und kein Funktionsobjekt sein. Am wichtigsten ist, Ich muss in der Lage sein, Arbeit in der Wrapper-Funktion zu tun.
Wenn die Inline-Kommentare nicht klar sind, würde ich das so etwas wie die Lage sein, gerne tun folgende:
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>;
ich für verwandte Beiträge gesucht und gefunden diese, aber keiner von ihnen ist ganz das, was Ich versuche es zu tun. Die meisten dieser Posts betreffen Funktionsobjekte. Ist das, was ich versuche, überhaupt möglich?
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
Als Antwort auf die ersten beiden Antworten habe ich die Frage bearbeitet, um klarzustellen, dass ich in der Lage sein muss, in der Wrapper-Funktion zu arbeiten (d. H. ändern einige globalen Zustand vor und nach dem Aufruf der eingewickelt Funktion)
Danke! Ich ändere das zur akzeptierten Antwort, weil es kürzer ist als das von @TC, benutzt nur eine Funktion und nicht eine Struktur, benutzt 'std :: forward' und ist (meiner Meinung nach) leichter zu verstehen, weil du es nicht getan hast Verwenden Sie Template Argument Spezialisierung. – Eric
Obwohl ich zugeben muss, dass der std :: forward nur drin ist, weil ich etwas versucht habe, das unter MSVC kompilieren würde und dachte dann "ah schraube es, werde nicht passieren ... aber hey, behalte den Forward" ;-) – VolkerK
Was? ist der richtige Weg, um einen Alias für den Wrapper zu deklarieren, der wie eine normale Funktion aussehen wird? Etwas wie 'using a_wrapped = wrapper;' (aber dieses funktioniert nicht). –
eudoxos