[C++-sig] Re: call_method

Brett Calcott brett.calcott at paradise.net.nz
Wed Dec 4 11:02:00 CET 2002


On Dec 01 21:00, David Abrahams wrote:
> 
> OK, I've implemented the first part of this change in the CVS.
> The current status is:
> 
> * Any Python object wrapping a C++ object of type T can be converted
>   to a shared_ptr<U>, where U is T or any of its publicly-accessible
>   base classes and U has been exposed with class_<U, ...>
> 
> * There is no need to explicitly specify shared_ptr<T> as the holder
>   in class_<T, ...>
> 
> * The shared_ptr actually manages the lifetime of the Python object,
>   so it will never be destroyed before the corresponding C++ object is
>   destroyed.

Very cool.

> 
> Not implemented yet:
> 
> * Automatic conversion of shared_ptr<T> to python (e.g. when used as a
>   return type). For that, you still need to pass shared_ptr<T> to
>   class_<...> as the holder, and since the old mechanism doesn't take
>   advantage of the new shared_ptr deleter introspection feature yet,
>   you always get a new Python object.

You could roll your own for the moment with a ustom to_python convertor
- right?

> 
> Open questions:
> 
> * There is some cost in code and compilation time associated with
>   these automatic conversions for each class_<...> instance. Should
>   users really be forced to pay for these conversions, or should they
>   be explicitly requested, e.g.
> 
>      register_shared_ptr<T>();
> 
>   Such a function may be needed anyway, since classes that are exposed
>   other than via class_<> (see, e.g. class Simple in
>   libs/python/test/m1.cpp) may want to be managed via shared_ptr<>.

Anything to ease the strain on our poor compilers would be good :) 
Of course, I'll be using it all the time.

> 
> * Can we do better for "callback classes" which dispatch virtual
>   functions to Python (like BaseWrap at
>   http://www.boost.org/libs/python/doc/tutorial/doc/class_virtual_functions.html)
>   than to ask users to store their own PyObject* "self" reference?
>   Some opportunities we may be missing by not providing a nice base
>   class:
> 
>   1. The ability to prevent users from copying, or even creating these
>      objects - which is dangerous because of the weak PyObject*
>      reference.
> 
>   2. The ability to relieve users from having to touch the self
>      pointer when implementing virtual function overrides (call_method
>      could be a member of the base class)
> 
>   3. The ability to convert shared_ptrs, references, and pointers to
>      these classes into Python objects without creating a new Python
>      object - instead we could just use the stored self pointer if we
>      can detect derivationj from our special base class. I'm not very
>      convinced this is useful for shared_ptr, since deleter
>      introspection will allow us to retrieve the PyObject* if the
>      object came from Python -- and shared_ptr<BaseWrap> shouldn't
>      arise otherwise if we implement #1. However, it might be useful
>      for regular pointers and references.

I've just got the latest cvs source and I'm getting my head back into
this -- give me a little time to play and I'll try and say something
sensible.

> 
> * And now, a radical notion: should we ban the use of shared_ptr<T> as
>   an argument to class_<...> ?
>   

As above..

Thanks for the new funkiness.

Cheers,
Brett




More information about the Cplusplus-sig mailing list