Verfügbarmachen von C ++ - Funktionen, die Zeiger mit Boost.Python zurückgeben

8

Ich möchte die folgende C ++ - Funktion für Python mit Boost.Python verfügbar machen:

%Vor%

Wenn ich versuche, diese Bibliothek zu kompilieren, tritt der Fehler auf (es ist meine Vermutung) Boost.Python weiß nicht, wie man int * in PyObject umwandelt.

Ich denke, was getan werden muss, ist die Konversionsstruktur, etwa so:

%Vor%

Und übergeben Sie es an die BOOST_PYTHON_MODULE-Deklaration:

%Vor%

Aber es funktioniert auch nicht. Und ich kann keine Informationen darüber finden, wie die Funktionen behandelt werden, die Zeiger zurückgeben.

Kann jemand helfen?

    
avli 04.07.2014, 07:07
quelle

1 Antwort

11

Kurz gesagt, kann man eine Funktion, die int* mit Boost.Python zurückgibt, nicht direkt verfügbar machen, da es in Python keine sinnvollen entsprechenden Typen gibt, da ganze Zahlen unveränderlich sind.

  • Wenn das Ziel darin besteht, eine Zahl an Python zurückzugeben, geben Sie int nach Wert zurück. Dies kann die Verwendung einer Hilfsfunktion erfordern, um ältere APIs anzupassen.
  • Wenn das Ziel darin besteht, einen Zeiger auf ein mit einem new-Ausdruck zugewiesenes Objekt zurückzugeben, muss das Objekt eine Klasse oder eine Union sein, und die Funktion muss mit bestimmten Richtlinien zur Angabe der Verantwortlichkeiten des Besitzers versehen sein.

Anstatt die endgültige Lösung sofort zu präsentieren, möchte ich mir die Zeit nehmen, die Compiler-Fehler durchzugehen. Mit Boost.Python werden manchmal statische statische C ++ 11-Assertionen verwendet, um Anweisungen in den Compiler-Nachrichten bereitzustellen. Leider kann es schwierig sein, sie unter den schweren Vorlagen zu finden.

Der folgende Code:

%Vor%

erzeugt die folgende relevante Ausgabe in clang, wobei die wichtigen Details fett hervorgehoben sind:

%Vor%

Boost.Python teilt uns mit, dass eine boost::python::return_value_policy angegeben werden muss für Funktionen, die int* zurückgeben. Es gibt verschiedene Modelle von ResultConverterGenerators . Häufig werden die Richtlinien verwendet, um die Besitz- oder Lebensdauer-Semantik des zurückgegebenen Objekts zu steuern. Da die Funktion im ursprünglichen Code einen neuen Zeiger direkt an Python zurückgibt, wird boost::python::manage_new_object ist angebracht, wenn der Aufrufer die Verantwortung für das Löschen des Objekts übernehmen soll.

Die Angabe einer Richtlinie für die Objektverwaltung schlägt weiterhin fehl:

%Vor%

erzeugt die folgende relevante Ausgabe:

%Vor%

In diesem Fall informiert uns Boost.Python darüber, dass das Objekt, das von einer Funktion mit einem managed_new_object ResultConverterGenerator zurückgegeben wird, entweder ein class oder union sein muss. Für int* ist die am besten geeignete Lösung, den Wert int nach Wert zurückzugeben, wenn Sie den Boost.Python-Layer durchlaufen. Der Vollständigkeit halber zeigt jedoch Folgendes:

  • Verwenden einer Hilfsfunktion zum Anpassen einer Legacy-API.
  • Wie man die Erstellung eines benutzerdefinierten Typs mit einer Factory-Funktion einschränkt, die Zeiger zurückgibt.
%Vor%

Interaktive Verwendung:

%Vor%     
Tanner Sansbury 17.08.2014, 20:53
quelle

Tags und Links