问题
I had a question about boost python. I've been working on exporting some functionality of a project into boost python, and I haven't found a way to solve the following problem: I have a set of StatusEffect objects that i store and use throughout the game. At the game startup, I want to be able to call a python script that will populate/add to the set of status effect objects. I'm having no problems exposing the StatusEffect class and it's derived class to python and calling the script.
The problem is that I'm storing that StatusEffect objects in an std::vector<boost::shared_ptr<StatusEffect> > Effects;
I have no idea how to create new instances of boost::shared_ptr<StatusEffect>
aside from the method of adding a static create method as described here http://wiki.python.org/moin/boost.python/PointersAndSmartPointers Given the large number of constructors and the wide variety of derived classes I have, this seems an unoptimal solution at best. I'd like to be able to create instances of boost::shared_ptr directly using the constructors of the StatusEffect objects, and be able to add those to the vector. Is this possible?
An answer or some helpful suggestions would be helpful. I asked a simialr question yesterday but unfortunately it wasn't of much help.
Thanks in advance
回答1:
I hope I am understanding your question. If you declare your python class with the shared_ptr
as shown at http://wiki.python.org/moin/boost.python/PointersAndSmartPointers, then boost::python
will automatically convert StatusEffect
objects you create in python to shared_ptr<StatusEffect>
if necessary (you can try this e.g. by .def
-ing a function which takes const shared_ptr<StatusEffect>&
or shared_ptr<StatusEffect>
as argument, and call it with StatusEffect
instance created in python.
If you want to assign an attribute of type vector<shared_ptr<StatusEffect> >
, you must create converters for it (from python sequences, and back), that's described in documentation. For an example, see c++ to python converter template (line 120), python to c++ template (line 127), and then using it for various types (including shared_ptr's) contained in the sequences (line 212).
Then you can write something like yourObject.listOfStatusEffects=[StatusEffect(),StatusEffect(),StatusEffect()]
来源:https://stackoverflow.com/questions/5925282/instantiating-shared-ptrs-in-boostpython