मैं C++ कक्षाओं से पाइथन मॉड्यूल बनाने के लिए बूस्ट.पथन का उपयोग कर रहा हूं। और मैं संदर्भों के साथ एक समस्या में भाग गया।Boost.Python - संदर्भ द्वारा वापस कैसे करें?
निम्नलिखित मामले पर कंडिडर जहां मेरे पास अधिभारित विधियों के साथ कक्षा फू है जो या तो मूल्य या संदर्भ द्वारा वापस आ सकता है।
यह निर्दिष्ट करना कि एक हस्ताक्षर टाइप करने के बाद मूल्य द्वारा वापसी का उपयोग करना आसान था। लेकिन मुझे लगता है कि यह return_value_policy
का उपयोग करके एक संदर्भ भी संभव हो सकता है। हालांकि, उचित लग रहा था (doc) का उपयोग करना; return_value_policy<reference_existing_object>
काम नहीं कर रहा था।
क्या मैंने गलत समझा है कि यह क्या करता है?
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
;
}
नोट: मुझे पता है कि जीवन के प्रबंधन के बिना मौजूदा वस्तु को संदर्भित करना खतरनाक हो सकता है।
अद्यतन:
ऐसा लगता है कि यह वस्तुओं के लिए काम करता है नहीं लेकिन बुनियादी डेटा प्रकार।
इस संशोधित उदाहरण लें:
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);
;
}
जो एक परीक्षा में अपेक्षित परिणाम दिया:
>>> foo1 = Foo(123)
>>> foo1.get()
123.0
>>> foo2 = foo1.get_self()
>>> foo2.set(1)
>>> foo1.get()
1.0
>>> id(foo1) == id(foo2)
False
हाँ, मुझे पता है कि पाइथन में सबकुछ संदर्भ है। जब मैं Boost.Python के साथ एक पायथन विधि बनाता हूं जो "मूल्य से" लौटाता है, तो वह उस प्रकार की एक प्रति देता है। मैं क्या करना चाहता हूं * प्रति * प्रतिलिपि नहीं है, बल्कि इसके बजाय एक ही उदाहरण का संदर्भ बनाएं। – mandrake