我使用Boost.Python从C++类创建Python模块。我遇到了一个引用问题。Boost.Python - 如何通过引用返回?
Condider以下情况下,我有一个类Foo与重载get方法,可以返回值或引用。
指定按值使用返回值应该很简单,只要我键入签名即可。但我认为应该可以通过使用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
是的,我知道一切都是Python中的引用。当我用Boost.Python创建一个“按值”返回的python方法时,它会返回该类型的副本。我想要做的是*不*复制,而是创建一个对同一个实例的引用。 – mandrake 2009-10-15 10:01:43