[C++-sig] Best way to register shared_ptr<const T>
Alex Mohr
amohr at pixar.com
Thu Jan 24 23:00:02 CET 2008
> It looks you know a lot about it... would you be able to help me on the other issue I posted recently:
> http://mail.python.org/pipermail/c++-sig/2008-January/013254.html
>
> somehow boost::python is able to tell when 2 different instances of a boost::shared_ptr<> point to
> the same C++ object.
>
> This is not the case for custom smart pointers.
>
> I'm happy to investigate, but I could not find where to start. Do you know how it works?
Boost.python has special-case code for shared_ptr. When boost.python
creates a shared_ptr for a class, it supplies a special custom deleter
that tracks the python object identified with the c++ object.
When a shared_ptr is converted to_python, boost.python checks to see if
it has its special deleter, and if so, it can get the existing python
object from it. That's how "object identity" is maintained for shared_ptr.
It is possible to make object identity work for custom smart pointers,
but it is hard. What we're doing is totally gross. After a class_<> is
registered with boost.python, I manually replace the to_python
converter that boost.python registered with my own that wraps it but
also does custom object-identity mapping. This requires digging into
the conversion registry using private api, and doing nasty stuff, but
you *can* make it work.
Alex
More information about the Cplusplus-sig
mailing list