Ich muss Python-Bindungen für eine C ++ - Codebasis erstellen. Ich benutze boost :: python und ich stieß auf Probleme beim Versuch, Klassen zu enthüllen, die Funktionen enthielten und Vorlagen zurückgaben. Hier ist ein typisches Beispiel
%Vor%Typisch T sind string, double, vector.
Nach dem Lesen der Dokumentation Ich habe versucht, dünne Wrapper für jeden Typ zu verwenden. Hier sind die Wrapper für String und Double und die entsprechende Klassendeklaration.
%Vor%Es kompiliert ok, aber wenn ich versuche, die Python-Bindungen zu verwenden, bekomme ich eine C ++ Ausnahme.
%Vor%Interessanterweise, wenn ich Foo nur für den Double- oder String-Wert exponiere, d. h.
%Vor%Es funktioniert gut. Fehle ich etwas?
Dies hängt möglicherweise nicht direkt mit Ihrem Problem zusammen, aber ich würde dem Signatur-Casting mit solchen Vorlagen nicht vertrauen. Ich hätte es so eingepackt:
%Vor%Wenn das nicht funktioniert, müssen Sie möglicherweise einige Shim-Funktionen erstellen:
%Vor%und exportieren Sie diese als gedacht, dass sie Mitgliedfunktionen waren.
Das Exportieren mehrerer Funktionsüberladungen unter dem gleichen Namen ist in Boost :: Python eine absolut gültige Sache, daher glaube ich nicht, dass dies das Problem ist.
Ich vermute, das Problem ist, dass boost :: python nicht weiß, welche Überladung "getValue" aufrufen soll - sollte es getValueDouble oder getValueString aufrufen? Wenn Sie sie explizit als getValueString und getValueDouble (als Methodenname) binden, wette ich, dass es funktioniert.
Was ist mit dem Erstellen eines C ++ - Wrappers für Getter / Setter, die ein boost :: python :: object zurückgeben? Sie können dann einfach den Typ bestimmen, den Sie in Ihrem C ++ - Wrapper erhalten haben, und ihn in / von boost :: python :: object packen / entpacken.
%Vor%Tags und Links python c++ boost boost-python