[C++-sig] question about vectors of pointers (boost python)
Roman Yakovenko
roman.yakovenko at gmail.com
Tue Jul 15 07:22:57 CEST 2008
On Tue, Jul 15, 2008 at 6:11 AM, David Philp <david.philp at anu.edu.au> wrote:
>
> Hi
>
> This is very much a newbie question... but I can't find the answer anywhere
> in the boost python documentation or elsewhere. Please feel free to give a
> URL instead of an answer.
>
> I have a vector of pointers in C++, and am trying to expose them to python.
> In particular I want to be able to iterate through them using e.g.
>
> for item in my_vec:
> print item.i
>
> This always fails with the following:
> TypeError: No to_python (by-value) converter found for C++ type: my_struct*
> (In every other way it works as expected.)
>
> The error seems reasonable: I have told Python about my_struct, but not
> what to do with my_struct*. I want Python to treat my_struct* as though it
> were a my_struct, but I can't figure out what I need to do. Do I need to
> use pointer_wrapper? Is there an example?
>
> Some context that may be important: it's not apparent from this example, but
> I intend for the vector to be owned by a C++ class that will be in existence
> for the lifetime of the Python program. So I am not overly concerned about
> details of memory management (unless they are more important than I
> thought.)
>
> Many thanks in advance!
>
> David
>
> -----------------Relevant C++ code-----------------
>
> struct my_struct
> {
> int i_;
> bool operator==(my_struct const& m) const {return i_ == m.i_;}
> };
>
> BOOST_PYTHON_MODULE(pye)
> {
> class_<my_struct>("my_struct")
> .def_readwrite("i", &my_struct::i_)
> ;
>
> class_<std::vector<my_struct *> >("my_struct_vector")
> .def(vector_indexing_suite<std::vector<my_struct *> >())
> ;
> };
>
>
> -----------------Relevant Python code-----------------
>
> from pye import *
> q = my_struct()
> q.i = 3
>
> my_vec = my_struct_vector()
> my_vec.append(q)
>
> len(my_vec)
> print my_vec[0].i
>
> for item in my_vec :
> print item.i
I think you should use NoProxy parameter and set it to true:
http://www.boost.org/doc/libs/1_35_0/libs/python/doc/v2/indexing.html
class_<std::vector<my_struct *> >("my_struct_vector")
.def(vector_indexing_suite<std::vector<my_struct *>, true >())
--
Roman Yakovenko
C++ Python language binding
http://www.language-binding.net/
More information about the Cplusplus-sig
mailing list