使用 boost.python 公开 std::vector<struct>
Exposing std::vector<struct> with boost.python
我有一个现有的 c++ 代码库,它使用带有 std::vector 的结构,应该向 python 公开。
在标题中:
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::p ython 片段:
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)
}
(仅供参考,虚构类 dummy3 用于模拟命名空间,因此无法使用范围。
编译和导入过程是可以的,我可以访问 singlefoo,但是每当我尝试访问矢量 foos 时,我都会遇到以下错误消息。
Python class registered for C++ class std::vector<myName::sFOO,
std::allocator<myName::sFOO> >
为了规避这个问题, 我首先尝试了vector_indexing_suite,但它无助于公开预定义的结构向量。
我还假设应该有一个与向 python 公开指针相关的解决方案,所以我尝试通过以下方式获取指针:
.def("get_vector",&myName::myfoo::get_vector)
这会产生编译错误。
由于我对C++和Boost都是新手,因此任何评论,包括解决方案,搜索技巧以及对合适参考的建议,将不胜感激。
提前感谢!
方法.def("get_vector",&myName::myfoo::get_vector)
不起作用,因为它返回指向向量的指针,因此有必要通知定义应如何管理对象所有权的策略:
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
:
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>>())
;
相关文章:
- 理解boost::asio-async_read在无需读取内容时的行为
- boost::进程间消息队列引发错误
- 如何运行位于boost/libs/python/example/tutorial目录中的hello.cpp和Jamfil
- std::map<struct,struct>::find 找不到匹配项,但是如果我循环通过 begin() 到 end(),我在那里看到匹配项
- Openssl 1.1.1d无效使用不完整的类型"struct dsa_st"
- cmake如何在fedora工作站中找到boost静态库包
- CMake项目Boost库错误:Boost/config/compiler/gcc.hpp:165:10:致命错误:cs
- Boost Graph Library,修复节点大小
- 什么是"#include <boost/functional/hash.hpp> "?
- 基于boost的程序的静态链接——zlib问题
- C++:如何在CLion IDE中安装Boost
- C++Boost Asio Pool线程,带有lambda函数和传递引用变量
- 如何在boost beast http请求中设置http头
- Boost Spirit,获取迭代器内部语义动作
- boost::asio::steady_timer()与sleep()我应该使用哪一个
- Boost.Fusion define struct array member
- 使用 boost.python 公开 std::vector<struct>
- boost :: Spirit属性分配:struct is_nullary:基本类型无法成为结构或类型
- 提升精神语法错误 - "no type named ‘size’ in ‘struct boost::spirit::unused_type’"
- 为什么boost::fusion序列中的struct数组成员类型不能正确推导