[C++-sig] std::vector
Scott A. Smith
ssmith at magnet.fsu.edu
Wed Oct 2 16:02:38 CEST 2002
Hello,
I have been reading the documentation on dealing with std::vector<> in
Boost.Python, http://www.boost.org/libs/python/doc/cross_module.html, and
this is exactly what I need for both vectors of built-in types and those
using my own classes. I have used the class builder to expose such a vector
as a Python object and now need to be able to go back and export some C++
functions that use them as arguments or as a return type.
Is there a module already in Boost.Python that has "std_vector"? I cannot
find anything on it and the html page above only supposes that one had such
a module. I think it would help me out quite a bit if I could play with some
vector<int> functions to try out what is suggested. Even more, if some of
this is already in Boost.Python I would surely like to use it rather than
begin doing so for all the class types I am using with std::vector.
For example, I have this to expose my std::vector<std::string>:
boost::python::class_builder<std::vector<std::string> >
Vstring(PyModule, "Vstring");
Vstring.def(boost::python::constructor<>());
Vstring.def(Vstring_push_back, "push_back");
and this allows me to make objects of Vstring in Python just fine. The
push_back stuff is done as shown in the comprehensive test. Now, how do I
get
VS = Vstring()
VS = MyFunctionReturningStdVectorOfStrings()
MyFunctionUsingStdVectorOfStrings(VS)
by exporting C++ functions that are something like
std::vector<std::string> MyFunctionReturningStdVectorOfStrings();
void MyFunctionUsingStdVectorOfStrings(std::vector<std::string>);
to work in Python. Do I need import_converters/export_converters? Do I need
them even when everything is in the same module? Neither the "vector_double"
nor "string_map" in the comprehensive test show this and AFAIK the test does
have any code where C++ functions using and returning std::vector<double>
are exported and making use of vector_double.
Is there other documentation on this, or perhaps a place where I can easily
search for such info?
Thanks,
Scott
=======================================
Dr. Scott A. Smith
Associate in Research
National High Magnetic Field Laboratory
1800 East Paul Dirac Drive
Tallahassee, FL 32310
phone: (850) 644-6348
FAX: (850) 644-1366
email: ssmith at magnet.fsu.edu
http://www.magnet.fsu.edu
http://gamma.magnet.fsu.edu
> -----Original Message-----
> From: c++-sig-admin at python.org [mailto:c++-sig-admin at python.org]On
> Behalf Of David Abrahams
> Sent: Wednesday, October 02, 2002 8:05 AM
> To: c++-sig at python.org
> Subject: Re: [C++-sig] Pointer manipulation Boost.Python - C++
>
>
> I'm going to answer this in terms of Boost.Python v2, since v1 is now
> retired and won't be in the upcoming release.
>
> From: "Mathieu Tremblay" <mtremblay at golemlabs.com>
>
>
> > Hello,
> > I am taking a look at Boost.Python and I wonder if it is possible
> > to convert pointers to existing classes to PyObjects* and then be
> > able to pass an existing instance of an object directly to and from
> > python:
>
> It is.
>
> > Example:
> > In C++ I create a CWheel and I set its member m_diameter to 1233. In
> > python I have a function that receives a CWheel and displays the
> > diameter (Lets suppose that Python knows the CWheel from Boost.Python
> > :-) )
> > Ex : def printCWheelDiam(awheel):
> > print awheel.m_diameter
> >
> > What I would like to do Is to create the CWheel in C++,
> > pass its pointer to python so it can manipulate
> > it (and see that its diameter is 1233) and then return a
> > CWheel that I could map from a PyObject to a CWheel in C++.
>
> The safest thing to do is to create the CWheel by invoking its class
> wrapper:
>
> // Declare the CWheel extension class
> object wheel_class =
> class_<CWheel>("CWheel")
> .def_readonly("m_diameter", &CWheel::m_diameter)
> .def("some_member_function", &CWheel::some_member_function)
> ...
> ;
>
> object wheel_obj = wheel_class(); // construct one
>
> Now you can pass wheel_obj back to python, and all reference counts are
> nicely managed. You don't need to "map" anything between C++ and Python;
> the library takes care of that for you.
>
> If you really want to pass pointers around, it's certainly
> possible to tell
> the library to build a Python object around the pointer, but then you need
> to make sure the lifetime of the C++ object being referenced by
> the pointer
> extends past the lifetime of all Python references to the object or your
> program will crash.
>
>
> -----------------------------------------------------------
> David Abrahams * Boost Consulting
> dave at boost-consulting.com * http://www.boost-consulting.com
>
>
>
> _______________________________________________
> C++-sig mailing list
> C++-sig at python.org
> http://mail.python.org/mailman/listinfo/c++-sig
>
More information about the Cplusplus-sig
mailing list