[C++-sig] Re: vector<foo*> -> list, preserving identity

Jacek Generowicz jacek.generowicz at cern.ch
Mon Dec 1 10:39:48 CET 2003


Raoul Gough <RaoulGough at yahoo.co.uk> writes:

> Jacek Generowicz <jacek.generowicz at cern.ch> writes:

[snip]

> > How should I write a converter for the std::vector<foo*>, in order to
> > preserve the identity of the foos ?
> >
> > (In the library I am wrapping, the return type of makefoos is actually
> > const std::vector<const foo*>&)
> 
> I'm not sure how you would handle this, except by switching to
> boost::shared_ptr instead of plain pointers. You would end up with
> something like this:
> 
> std::vector<boost::shared_ptr<const foo> > makefoos(int n) {
>   // ...
> }

Unfortunately "makefoos" is part of a library over which I have no
control, so I cannot make it return shared pointers.

> BOOST_PYTHON_MODULE( nocopy ) {
>   class_<foo, boost::shared_ptr<foo> >("foo", no_init)
>     .def("pointer", &foo::pointer);
> 
>   class_<std::vector<boost::shared_ptr<foo const> > > ("foo_vector")
>     .def (SOMETHING<std::vector<boost::shared_ptr<foo const> >());
> 
>   def ("makefoos", makefoos);
> }
> 
> Where SOMETHING would use either the current indexing suite (available
> from CVS)

Once again, I am obliged to use the local offical Boost version
(1.30.2, at the moment), as that is what my users have. The Boost
version I use is beyond my control.



How does reference_existing_object work?  Using it as the return value
policy for functions returning foo* preserves identity just fine.
It's just when I get a whole vector of them and try to put them in a
Python list that I don't seem to manage to avoid copying the objects
themselves.





More information about the Cplusplus-sig mailing list