Ich bin im Grunde um einen Wrapper für eine generische C-Funktion zu generieren, ohne die Typen manuell angeben zu müssen. Also habe ich einen Callback mit einem festen Prototyp, aber ich werde einen speziellen Code im Wrapper basierend auf dem Typ der eingepackten Funktion machen müssen ... Also denke ich im Grunde daran, eine statische Methode in einer Klassenvorlage zu verwenden wrap meine Funktion auf eine konforme Schnittstelle zB:Nicht-Typ Vorlagenparameter ... das ist eine Vorlage! (C++)
// this is what we want the wrapped function to look like
typedef void (*callback)(int);
void foobar(float x); // wrappee
// doesn't compile
template< T (*f)(S) > // non-type template param, it's a function ptr
struct Wrapper
{
static void wrapped(int x)
{
// do a bunch of other stuff here
f(static_cast<S>(x)); // call wrapped function, ignore result
}
}
und dann würde ich mag, wie etwas zu tun ist:
AddCallback(Wrapper<foobar>::wrapped);
Allerdings ist das Problem, dass ich einfach nicht voran gehen und Verwendung ein "S" im Parameter der Funktion in der Wrapper Vorlage, muss ich es zuerst als Parameter auflisten:
template< class T, class S, T (*f)(S) >
struct Wrapper
// ...
Aber das bedeutet, es ist viel schmerzhafter zu verwenden (Wrapper<void,float,foobar>::wrapped
), idealerweise möchte ich einfach den Funktionszeiger dort übergeben und es die Typen der Parameter (und Rückgabetypen) automatisch erarbeiten lassen. Um klar zu sein, muss ich mich innerhalb der eingepackten Funktion auf die Typen des Funktionszeigers beziehen (also brauche ich ein Äquivalent von S oder T).
Gibt es eine Möglichkeit, dies zu tun?
@damndirtyape: Ich habe über deine Frage nachgedacht, und ich denke, ich habe etwas ähnliches getan. Leider war viel Code nötig. Im Grunde hatte meine Lösung eine Basisklasse, die operator() überladen hat, und ich hatte Factory-Funktionen, die basierend auf dem übergebenen Funktionstyp Basisklassen daraus erstellten. Wenn Sie möchten, kann ich den Code irgendwo in einem Pastebin posten. –