[C++-sig] question about vectors of pointers (boost python)

David Philp david.philp at anu.edu.au
Tue Jul 15 07:37:55 CEST 2008


On 15/07/2008, at 3:22 PM, Roman Yakovenko wrote:

> 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 >())

I tried that (it looks likely) but fails with the same error.  (No  
to_python (by-value) converter found for C++ type: my_struct*).

Thanks, though I'm hoping for more answers...

D





More information about the Cplusplus-sig mailing list