用 boost.python 公开 std::vector<struct>
Exposing std::vector<struct> with boost.python
我有一个现有的 c++ 代码库,它使用带有 std::vector 的结构,应该公开给 python。
在 header 中:
struct sFOO
{
unsigned int start = 3 ;
double foo = 20.0 ;
};
在 cpp 中:
namespace myName
{
myfoo::myfoo(){
sFOO singlefoo;
std::vector<sFOO> foos;
}
sFOO singlefoo;
std::vector<sFOO>* myfoo::get_vector(){
return &foos;
}
}
和 boost::python 片段:
using namespace boost::python;
class dummy3{};
BOOST_PYTHON_MODULE(vStr)
{
scope myName = class_<dummy3>("myName");
class_<myName::sFOO>("sFOO")
.add_property("start",&myName::sFOO::start)
.add_property("foo",&myName::sFOO::foo)
;
class_<myName::myfoo>("myfoo", no_init)
.def(init<>())
.def("checkfoo",&myName::myfoo::checkfoo)
.add_property("foos",&myName::myfoo::foos)
.add_property("singlefoo",&myName::myfoo::singlefoo)
}
(仅供参考,虚构的 class dummy3 用于模拟命名空间,因此不能使用范围。)
A编译和导入过程都OK,我可以访问singlefoo,但是每当我尝试访问vector foos时,我遇到下面的错误信息。
Python class registered for C++ class std::vector<myName::sFOO,
std::allocator<myName::sFOO> >
为了避免这个问题,
我首先尝试了 vector_indexing_suite,但它无助于暴露结构的 pre-defined 向量。
我还假设应该有一个与公开指向 python 的指针相关的解决方案,所以我尝试通过以下方式获取指针:
.def("get_vector",&myName::myfoo::get_vector)
产生编译错误。
由于我对 C++ 和 Boost 都是新手,因此非常感谢任何评论,包括解决方案、搜索提示和合适参考的建议。
提前致谢!
方法 .def("get_vector",&myName::myfoo::get_vector)
不起作用,因为它 returns 一个指向矢量的指针,因此有必要通知定义对象所有权应如何管理的策略:
class_<myName::myfoo>("myfoo", no_init)
// current code
.def("get_vector", &myfoo::get_vector, return_value_policy<reference_existing_object>())
;
为了使用vector_indexing_suite,需要将equal to operator
实现到它持有的class:
struct sFOO
{
unsigned int start = 3 ;
double foo = 20.0 ;
bool operator==(const sFOO& rhs)
{
return this == &rhs; //< implement your own rules.
}
};
然后你可以导出向量:
#include <boost/python/suite/indexing/vector_indexing_suite.hpp>
class_<std::vector<sFOO>>("vector_sFOO_")
.def(vector_indexing_suite<std::vector<sFOO>>())
;
我有一个现有的 c++ 代码库,它使用带有 std::vector 的结构,应该公开给 python。
在 header 中:
struct sFOO
{
unsigned int start = 3 ;
double foo = 20.0 ;
};
在 cpp 中:
namespace myName
{
myfoo::myfoo(){
sFOO singlefoo;
std::vector<sFOO> foos;
}
sFOO singlefoo;
std::vector<sFOO>* myfoo::get_vector(){
return &foos;
}
}
和 boost::python 片段:
using namespace boost::python;
class dummy3{};
BOOST_PYTHON_MODULE(vStr)
{
scope myName = class_<dummy3>("myName");
class_<myName::sFOO>("sFOO")
.add_property("start",&myName::sFOO::start)
.add_property("foo",&myName::sFOO::foo)
;
class_<myName::myfoo>("myfoo", no_init)
.def(init<>())
.def("checkfoo",&myName::myfoo::checkfoo)
.add_property("foos",&myName::myfoo::foos)
.add_property("singlefoo",&myName::myfoo::singlefoo)
}
(仅供参考,虚构的 class dummy3 用于模拟命名空间,因此不能使用范围。)
A编译和导入过程都OK,我可以访问singlefoo,但是每当我尝试访问vector foos时,我遇到下面的错误信息。
Python class registered for C++ class std::vector<myName::sFOO,
std::allocator<myName::sFOO> >
为了避免这个问题, 我首先尝试了 vector_indexing_suite,但它无助于暴露结构的 pre-defined 向量。
我还假设应该有一个与公开指向 python 的指针相关的解决方案,所以我尝试通过以下方式获取指针:
.def("get_vector",&myName::myfoo::get_vector)
产生编译错误。
由于我对 C++ 和 Boost 都是新手,因此非常感谢任何评论,包括解决方案、搜索提示和合适参考的建议。
提前致谢!
方法 .def("get_vector",&myName::myfoo::get_vector)
不起作用,因为它 returns 一个指向矢量的指针,因此有必要通知定义对象所有权应如何管理的策略:
class_<myName::myfoo>("myfoo", no_init)
// current code
.def("get_vector", &myfoo::get_vector, return_value_policy<reference_existing_object>())
;
为了使用vector_indexing_suite,需要将equal to operator
实现到它持有的class:
struct sFOO
{
unsigned int start = 3 ;
double foo = 20.0 ;
bool operator==(const sFOO& rhs)
{
return this == &rhs; //< implement your own rules.
}
};
然后你可以导出向量:
#include <boost/python/suite/indexing/vector_indexing_suite.hpp>
class_<std::vector<sFOO>>("vector_sFOO_")
.def(vector_indexing_suite<std::vector<sFOO>>())
;