On 08/15/2011 08:11 AM, Holger Joukl wrote:
Hi,
I'm trying to wrap a C++-API that uses void* to pass around arbitrary,
application-specific stuff.
I am a bit unsure about how to work the void-pointers. A viable way seems
to wrap the original
API functions with thin wrappers that take a boost::python::object and hand
the "raw" PyObject*
into the original function:
I don't see anything wrong with this approach, aside from the fact that
you have to make an explicit wrapper for all of your functions that take
void pointers. It might be a little less safe, but you should be able
to make things more automatic by casting function pointers that accept a
void* to a signature with void* replaced by PyObject*; Boost.Python does
know how to wrap functions that take PyObject*. For example, in the
wrapper for your "Worker" class, you'd have:
.def("destroy2",
(int (Worker::*)(DestructionCallback*,PyObject*))&Worker::destroy,
(bp::arg("cb"), bp::arg("closure")=bp::object())
)
I think this should do the same thing, though you may want to check that
default arguments work as expected. Of course this could lead to big
problems if you pass around things that aren't in fact PyObject* as void
pointers in the same places, though I think your solution suffers from
this too.
There really isn't anything automatic for dealing with void pointers in
Boost.Python, because it's so template-based - it really can't learn
anything from a void pointer.
Good luck!
Jim Bosch
_______________________________________________
Cplusplus-sig mailing list
Cplusplus-sig@python.org
http://mail.python.org/mailman/listinfo/cplusplus-sig