[C++-sig] Free function returning reference
Kor de Jong
k.dejong at geog.uu.nl
Fri Jul 9 10:24:48 CEST 2004
Hi all,
I have some difficulties wrapping free functions which return a
reference (or a pointer) to static variables:
struct Foo {
};
static Foo d_foo;
void setValue(Foo const& value) {
d_foo = value;
}
Foo const& value() {
return d_foo;
}
using namespace boost::python;
BOOST_PYTHON_MODULE(foopy) {
class_<Foo>("Foo")
;
def("setValue", &setValue);
def("value", &value, return_internal_reference<>());
}
I use the return_internal_reference call policy because I don't
want a copy to be created when value() is called. The first template
argument of return_internal_reference is the owner_arg. According to
the documentation: "If used to wrap a member function, parameter 1 is
the target object (*this)."
But how about wrapping free functions returning references or pointers to
static objects? I would like the Python variables recieving the references
or pointers to be able to use the object but they should not worry about
memory management in this case.
I wonder how the Boost.Python code above should be changed
to get it right. When using the wrapped library from Python a
"python::with_custodian_and_ward_postcall: argument index out of range"
exceptions is thrown when value() is called:
from foopy import *
foo = Foo()
setValue(foo)
value()
(I appologize if I missed something obvious in the manual.)
Best regards,
Kor
More information about the Cplusplus-sig
mailing list