From: Holger Brandsmeier <brandsmeier@gmx.de> To: Trigve Siver <trigves@yahoo.com>; Development of Python/C++ integration <cplusplus-sig@python.org> Cc: Sent: Thursday, June 21, 2012 11:58 PM Subject: Re: [C++-sig] C++ clas with (*args, **kwargs) constructor
T rigve,
with the line class_<Form, boost::noncopyable, boost::shared_ptr<Form>>("Form") ; you declare Form to have a default constructor (you didn't use any init<> struct. That is why you can not pass anything to the constructor. If you want to use a constructor with a single (but arbitrary) type, then you should use PyObject on the C++ side. Try to get this working and tell us if this is how you want it to work, I have a feeling that you already might not like having to manually convert the PyObject* to the proper types. However, you can not avoid it, you can not expect boost::python to automatically call a constructor taking a single `int` if all that you export is a constructor taking one `PyObject`, you will have to do the proper conversions on the C++ side.
Second if you want to work with many objects of type PyObject* or even `kwargs`, then http://wiki.python.org/moin/boost.python/HowTo#A.22Raw.22_constructor is one option. I didn't really do this myself, but what is your problem there?
Thanks for reply :) Ok it looks like it is working now :) When I used raw_constructor I have set min arguments to 2, like this: ... boost::shared_ptr<Form> create(tuple, dict) { return boost::shared_ptr<Form>(new Form()); } class_<Form, boost::noncopyable, boost::shared_ptr<Form>>("Form", no_init) .def("__init__", raw_constructor(&create, 2)) ... But when *args or **kwargs was empty (or both of them), it was spoiling errors. So I set min arguments to 0 (removed the parameter respectively). Hope I'm doing it right way.
...
-Holger
Thanks Trigve