On 9/4/07, <b class="gmail_sendername">Furkan Kuru</b> <<a href="mailto:furkankuru@gmail.com">furkankuru@gmail.com</a>> wrote:<div><span class="gmail_quote"></span><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
Hello,<br><br>Is there a way to expose structs containing pointers of their types?</blockquote><div><br>There is another problem here <br></div><br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
Let's say, I have a very simple doubly-linked list.<br><br>struct Node {<br> Node* next;<br> Node* prev;<br> int value;<br>};<br><br>I expose it like this:<br><br>class_<Node>("Node")
<br> .def_readwrite("value", &Node::value)<br> .def_readwrite("next", &Node::next)<br> .def_readwrite("prev", &Node::prev);<br><br>When I try to access the next and prev attributes of a Node instance in python,
<br>I get this error:<br><br>TypeError: No to_python (by-value) converter found for C++ type: struct Node *</blockquote><div><br><br>If you would have access to Py++, it would generate the right code for you. <br><br>Here is cut and paste of the relevant code from the unittests:
<br><br><br>struct tree_node_t{
<br> ...
<br> tree_node_t *left;
<br> ... <br>};
<br><br></div>struct tree_node_t_wrapper : tree_node_t, bp::wrapper< tree_node_t > {<br> ...<br><br> static tree_node_t * get_right(tree_node_t const & inst ){<br> return inst.right;<br> }<br>
<br> static void set_right( tree_node_t & inst, tree_node_t * new_value ){ <br> inst.right = new_value;<br> }<br><br>};<br><br></div><br> { //::tree_node_t
<br> typedef bp::class_< tree_node_t_wrapper > tree_node_t_exposer_t;
<br> tree_node_t_exposer_t tree_node_t_exposer = tree_node_t_exposer_t( "tree_node_t", "documentation", bp::init< bp::optional< member_variables::pointers::tree_node_t const * > >(( bp::arg("parent")=bp::object() ), "documentation") );
<br> bp::scope tree_node_t_scope( tree_node_t_exposer );
<br> tree_node_t_exposer.add_property( "right"
<br> , bp::make_function( (::tree_node_t * (*)( ::tree_node_t const & ))(&tree_node_t_wrapper::get_right), bp::return_internal_reference< >() )
<br> , bp::make_function( (void (*)( ::tree_node_t &,::tree_node_t * ))(&tree_node_t_wrapper::set_right), bp::with_custodian_and_ward_postcall< 1, 2 >() ));
<br> }<br><br>Pay attention to used call policies. They are very important.<br><br>HTH<br clear="all"><br>-- <br>Roman Yakovenko<br>C++ Python language binding<br><a href="http://www.language-binding.net/">http://www.language-binding.net/
</a>