我已经阅读了如何在boost python中将普通向量暴露给python,但我想知道如何公开和使用向量。例如,我有一个shared_ptrs向量,如下所示:
std::vector<shared_ptr<StatusEffect> > Effects;
基于暴露向量的材料,我应该能够公开这种类。我想知道的是我怎样才能真正添加它?如何创建shared_ptr<StatusEffect>
的实例,因为我无权访问new,而shared_ptr可以指向多个派生类型,这使得为每个类添加静态创建方法有点乏味。
有没有人有一些指示或可以建议如何做到这一点?为我想做的事情找到boost :: python的好例子是abit棘手
提前致谢
答案 0 :(得分:1)
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 >());
}
“真实”的论点很重要!
答案 1 :(得分:0)
有关示例,请参阅Pointers and smart pointers。
答案 2 :(得分:0)
你提到每个类的创建方法(构造函数)会有点乏味,但我认为这就是你需要的。
答案 3 :(得分:0)
您可以部分绑定boost::shared_ptr<StatusEffect>
,使用Boost.Python(使用boost::python::no_init
)省略构造。要与std::shared_ptr<StatusEffect>
建立类似的机制,您还需要使用boost::get_pointer<T>()
as explained in this other SO thread定义T = std::shared_ptr<U>
免费功能。这是一个可行解决方案的草图:
#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>());
}