Boost Python и векторы shared_ptr - PullRequest
7 голосов
/ 07 мая 2011

Я читал, как выставлять нормальные векторы для python в boost python, но я хочу знать, как выставлять и использовать вектор. Например, у меня есть вектор shared_ptrs следующим образом:

std::vector<shared_ptr<StatusEffect> > Effects;

Основываясь на материале для выставления векторов, я смогу разоблачить этот тип класса. То, что я хочу знать, - как я могу на самом деле добавить к этому? Как создать экземпляры shared_ptr<StatusEffect>, поскольку у меня нет доступа к новым, а shared_ptr может указывать на несколько производных типов, что делает добавление статического метода создания к каждому классу немного утомительным.

У кого-нибудь есть указатели или можете подсказать, как это сделать? Найти хороший пример для boost :: python для того, что я хочу сделать, было abit tricky

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

Ответы [ 4 ]

1 голос
/ 05 мая 2013
struct A {
    int index;
    static shared_ptr<A> create () { return shared_ptr<A>(new A); }
    std::string   hello  () { return "Just nod if you can hear me!"; }
};

BOOST_PYTHON_MODULE(my_shared_ptr)
{
    class_<A, shared_ptr<A> >("A",boost::python::init<>())
        .def("create",&A::create )
        .staticmethod("create")
        .def("hello",&A::hello)
        .def_readonly("index",&A::index)
    ;

    boost::python::class_<std::vector<shared_ptr<A>>>("PyVec")
    .def(boost::python::vector_indexing_suite<std::vector<shared_ptr< A>>,true >());

}

Аргумент ", правда" важен!

0 голосов
/ 15 августа 2013

Вы можете частично связать boost::shared_ptr<StatusEffect>, опуская конструкцию просто отлично с Boost.Python (используйте boost::python::no_init). Чтобы иметь подобный механизм с std::shared_ptr<StatusEffect>, вам также необходимо определить boost::get_pointer<T>() свободную функцию с T = std::shared_ptr<U> , как описано в этом другом потоке SO . Вот эскиз работоспособного решения:

#include <boost/python.hpp>
#include <memory>
...

namespace boost { 
  template<class T> T* get_pointer(std::shared_ptr<T> p) { return p.get(); } 
}

BOOST_PYTHON_MODULE(yourmodule) {

  using namespace boost::python;

  class_<StatusEffect, std::shared_ptr<StatusEffect>, boost::noncopyable>("StatusEffect", no_init);

  class_<std::vector<std::shared_ptr<StatusEffect> > >("StatusEffectVector")
    .def(boost::python::vector_indexing_suite<std::vector<shared_ptr<StatusEffect>>, true>());

}
0 голосов
/ 09 мая 2011

Вы упоминаете, что метод создания (конструктор) для каждого класса был бы немного утомительным, но я думаю, что это то, что вам нужно.

0 голосов
/ 07 мая 2011
...