Wie schreibe ich einen Wrapper über Funktionen und Member-Funktionen, der Code vor und nach der Wrapped-Funktion ausführt?

8

Ich versuche, eine Wrapper-Klasse oder -Funktion zu schreiben, die es mir erlaubt, Code vor und nach der Wrapped-Funktion auszuführen.

%Vor%

Idealerweise sollte der Wrapper generisch sein und sowohl für Funktionen als auch für Member-Funktionen mit jeder Signatur funktionieren.

Weitere Informationen:

Ich suche nach einer einfachen Möglichkeit, die GIL um meine teuren C ++ - Aufrufe freizugeben / wiederzuerlangen, ohne dass man so dünne Wrapper manuell schreiben muss:

%Vor%

Diese Art von Wrapper wird mehrere Male für alle Arten von Funktionen wiederholt, und ich würde gerne eine Lösung finden, die es mir erlauben würde, alle zu codieren.

Ich habe einige Ansätze ausprobiert, aber das Beste, was ich dazu bringen konnte, war, dass der Benutzer die Typen von Rückgabewerten und Parametern explizit angeben musste:

%Vor%

Aber es scheint mir, dass es möglich sein sollte, nur den Zeiger auf die Funktion (& amp; foo_wrapper) zu übergeben und den Compiler die Typen herausfinden zu lassen.

Kennt jemand eine Technik, die ich verwenden könnte oder in die richtige Richtung zeigen?

Prost!

    
Bruno Oliveira 25.01.2010, 20:39
quelle

2 Antworten

11

In diesem Fall können Sie eine Functor-Klasse schreiben, die Ihre Funktion umschließt, und dann boost :: python :: detail :: get_signature überladen, um Ihren Functor zu akzeptieren!

UPDATE: Zusätzliche Unterstützung für Mitgliederfunktionen!

Beispiel:

%Vor%

Und auf Python:

%Vor%     
e.tadeu 26.01.2010, 14:49
quelle
0

Haben Sie sich die von Stroustrup in seinem " Wrapping von C ++ - Memberfunktionsaufrufen "Papier? Es gibt auch eine SO-Antwort hier zeigt, wie man es prägnant umsetzt. Im Grunde genommen würden Sie eine Vorlage implementieren, die operator->() überlädt. Innerhalb dieser operator Implementierung würden Sie ein temporäres Objekt vor dem eigentlichen Funktionsaufruf erstellen. Der Konstruktor und der Destruktor des temporären Objekts sorgen dafür, dass Sie vor und nach dem eigentlichen Funktionsaufruf den Code " pre - " und " post - " aufrufen.

    
Void 25.01.2010 22:09
quelle