[C++-sig] creating an instance of a class_<> object in c++ and exporting it to python

Francois Ostiguy ostiguy at fnal.gov
Fri Aug 13 21:22:58 CEST 2004



Hi -

I am try in to do the following:

Consider a C++ class A wrapped using boost.python:

class_<A, A*, boost::noncopyable>("A", noinit)
  .def("f1", &A::f1)
  ....
  ;

>From C++,  I would like to

(1) create an instance of a wrapped object "A", initializing it using
    a  pointer to an existing instance of a C++ A object.

(2) export the python object into the namespace of an (embedded)
    interpreter.

AFAIK boost.python does not provide a mechanism to accomplish (2),
but that seems straightforward using the Python C-API.

I am really at a loss on how to achieve (1) using boost.python. It would
seem like a useful thing to create instances of wrapped objects in
C++.
The most relevant bit of information I found is in the tutorial:


> Due to the dynamic nature of Boost.Python objects, any class_<T> may
>  also be one of these types! The following code snippet wraps the class
> (type)
>  object.

>  We can use this to create wrapped instances. Example
>  object vec345 = (
>        class_<Vec2>("Vec2", init<double, double>())
>            .def_readonly("length", &Point::length)
>            .def_readonly("angle", &Point::angle)
>        )(3.0, 4.0);
>
>    assert(vec345.attr("length") == 5.0);


This code does create an instance of vec345;
however, unless I misunderstand something I am under
the impression that every invocation of
class_<A> will re-register the class A.
Perhaps this is not a problem; nevertheless it
appears unnecessarily redundant and potentially error-prone
(multiple class_<A> declarations appearing in different source
files).

Is it possible to somehow retrieve the class type of an extended
C++ class directly from the interpreter and then
create a new instance ?

Any comments or insight would be most welcome.


-Francois

----------------------------------------------------------------------------
Dr. Jean-Francois OSTIGUY                              voice: (630) 840-2231
Beam Physics Dept MS220                                  FAX: (630) 840-6039
Fermi National Accelerator Laboratory                email: ostiguy at fnal.gov
Batavia IL 60510-0500                           WWW:www-ap.fnal.gov/~ostiguy




More information about the Cplusplus-sig mailing list