Ich verwende Boost.Python, um Python-Module aus C++ - Klassen zu erstellen. Und ich stieß auf ein Problem mit Referenzen.Boost.Python - Wie man als Referenz zurückkommt?
Condider folgenden Fall, in dem ich eine Klasse Foo mit überladenen get-Methoden haben, die entweder Rückkehr nach Wert oder Verweis.
angeben, dass die Rückkehr nach Wert verwendet werden soll, war einfach, wenn ich eine Signatur typedefed. Aber ich denke, es sollte möglich sein, eine Referenz auch mit einem return_value_policy
zurückzugeben. Allerdings mit dem, was angemessen erschien (doc); return_value_policy<reference_existing_object>
schien nicht zu funktionieren.
Habe ich missverstanden, was es tut?
struct Foo {
Foo(float x) { _x = x; }
float& get() { return _x; }
float get() const { return _x; }
private:
float _x;
};
// Wrapper code
BOOST_PYTHON_MODULE(my_module)
{
using namespace boost::python;
typedef float (Foo::*get_by_value)() const;
typedef float& (Foo::*get_by_ref)();
class_<Foo>("Foo", init<float>())
.def("get", get_by_value(&Foo::get))
.def("get_ref", get_by_ref(&Foo::get),
return_value_policy<reference_existing_object>())//Doesn't work
;
}
Hinweis: Ich weiß, dass es gefährlich sein könnte vorhandenes Objekt ohne Lebenszeit Verwaltung zu verweisen.
Update:
Es sieht aus wie es für Objekte, nicht aber grundlegende Datentypen funktioniert.
Nehmen Sie dieses überarbeitete Beispiel:
struct Foo {
Foo(float x) { _x = x; }
float& get() { return _x; }
float get() const { return _x; }
void set(float f){ _x = f;}
Foo& self(){return *this;}
private:
float _x;
};
// Wrapper code
using namespace boost::python;
BOOST_PYTHON_MODULE(my_module)
{
typedef float (Foo::*get_by_value)() const;
class_<Foo>("Foo", init<float>())
.def("get", get_by_value(&Foo::get))
.def("get_self", &Foo::self,
return_value_policy<reference_existing_object>())
.def("set", &Foo::set);
;
}
, die in einem Test das erwartete Ergebnis gab:
>>> foo1 = Foo(123)
>>> foo1.get()
123.0
>>> foo2 = foo1.get_self()
>>> foo2.set(1)
>>> foo1.get()
1.0
>>> id(foo1) == id(foo2)
False
Ja, ich weiß, alles ist Referenzen in Python. Wenn ich eine Python-Methode mit Boost.Python erstelle, die "nach Wert" zurückgibt, wird eine Kopie dieses Typs zurückgegeben. Ich möchte * nicht * kopieren, sondern stattdessen einen Verweis auf dieselbe Instanz erstellen. – mandrake