Использование shared_ptr в boost :: python - PullRequest
0 голосов
/ 08 мая 2011

У меня возник вопрос о буст-питоне. Я работал над экспортом некоторых функциональных возможностей проекта в Boost Python, и я не нашел способа решить следующую проблему: У меня есть набор объектов StatusEffect, которые я храню и использую на протяжении всей игры. При запуске игры я хочу иметь возможность вызывать скрипт на python, который будет заполнять / добавлять в набор объектов эффектов статуса. У меня нет проблем с выставлением класса StatusEffect и его производного класса на python и вызовом скрипта.

Проблема в том, что я храню объекты StatusEffect в std::vector<boost::shared_ptr<StatusEffect> > Effects; Я понятия не имею, как создавать новые экземпляры boost::shared_ptr<StatusEffect> помимо метода добавления статического метода create, как описано здесь http://wiki.python.org/moin/boost.python/PointersAndSmartPointers Учитывая большое количество конструкторов и большое разнообразие производных классов, которые у меня есть, это кажется неоптимальное решение в лучшем случае. Я хотел бы иметь возможность создавать экземпляры boost :: shared_ptr напрямую, используя конструкторы объектов StatusEffect, и иметь возможность добавлять их в вектор. Это возможно?

Будет полезен ответ или несколько полезных предложений. Я задал вопрос simialr вчера, но, к сожалению, это не очень помогло.

Заранее спасибо

1 Ответ

2 голосов
/ 29 мая 2011

Надеюсь, я понимаю ваш вопрос. Если вы объявите свой класс Python с shared_ptr, как показано на http://wiki.python.org/moin/boost.python/PointersAndSmartPointers,, то boost::python автоматически преобразует StatusEffect объектов, которые вы создаете в Python, в shared_ptr<StatusEffect>, если необходимо (вы можете попробовать это, например, .def -ing функция, которая принимает const shared_ptr<StatusEffect>& или shared_ptr<StatusEffect> в качестве аргумента и вызывает ее с экземпляром StatusEffect, созданным в python.

Если вы хотите назначить атрибут типа vector<shared_ptr<StatusEffect> >, вы должны создать для него конвертеры (из последовательностей Python и обратно), как описано в документации. Например, см. Шаблон конвертера c ++ в python (строка 120), шаблон python в c ++ (строка 127), а затем используйте его для различных типов (включая shared_ptr), содержащихся в последовательностях (строка 212).

Тогда вы можете написать что-то вроде yourObject.listOfStatusEffects=[StatusEffect(),StatusEffect(),StatusEffect()]

...