$include_dir="/home/hyper-archives/boost/include"; include("$include_dir/msg-header.inc") ?>
From: rwgk_at_[hidden]
Date: 2001-01-19 15:39:18
I am using the latest CVS snapshot of boost.
We are trying to define BPL Python bindings for some C++ classes that
we are developing. In particular, we have a container class that
manages a set of a polymorphic objects. I have distilled the idea down
to a relatively simple example, dynatype.cpp. This file is available 
in
the boost egroup upload area:
    http://www.egroups.com/files/boost/dynatype.cpp
This simple python script shows what we want to do:
import dynatype
# Container with variables of a polymorphic type.
c = dynatype.container() # <container object at 1400523a0>
# Possible type identifiers are 'int' or 'double'.
c.declare('int', 'an_int')
c.declare('double', 'a_double')
# Get references to the variables in the container.
i = c.get('an_int') # <dynavalue_int object at 1400523f0>
d = c.get('a_double') # <dynavalue_double object at 140052440>
# Change the values of the variables.
i.set(3)
d.set(3.1415)
# Get them back (as Python integer or float).
i.get() # 3
d.get() # 3.1415
# This proves that j.set() changes the contents of the container.
j = c.get('an_int') # <dynavalue_int object at 1400523f0>
j.get() # 3
j.set(4)
i.get() # 4
This actually works, but there are a few issues:
0. Note that the values in the container are based on an abstract
   C++ class "dynabase."
   The actual values are C++ objects of the type "dynavalue<int>"
   and "dynavalue<double>."
   The container is implemented using a
     std::map<string, boost::shared_ptr<dynabase> >
1. The Python c.get() is bound to the C++ function py_get().
   Somewhere inside this function we have to have a dynamic_cast<>()
   from a shared_ptr<dynabase>
   to a   shared_ptr<dynavalue<int> >
   or a   shared_ptr<dynavalue<double> >.
   To do this, I had to modifiy smart_ptr.hpp (line 139):
   template<typename Y>
      shared_ptr(const shared_ptr<Y>& r) : px(dynamic_cast<T*>(r.px)) 
{
         ++*(pn = r.pn);
      }
   Questions:
     1. Is there a better way of doing this?
     2. If not, would there be a way of having both the old and my
        modified copy constructor, and could this become part of
        the standard smart_ptr.hpp?
2. There is a horrible memory leak associated with the use of c.get().
   I am pretty sure that this is due to the following invocation of
   to_python():
   
      boost::shared_ptr<dynavalue<int> > dvi(dv);
      return BOOST_PYTHON_CONVERSION::to_python(dvi);
   What is wrong with this use of to_python()?
Any advice is very much appreciated!
        Ralf