gpt4 book ai didi

c++ - 如何从 python 中包装的 c++ 类中读取列表<对象>

转载 作者:行者123 更新时间:2023-11-30 04:10:26 26 4
gpt4 key购买 nike

我在 C++ 中包装了类并暴露给 python,当我调用函数成员时它工作,问题是我无法访问数据(类 Path 中的公共(public)成员结果具有类型 std::list

BOOST_PYTHON_MODULE(map) // module name
{
class_<Path>("Path")
.def_readonly("result", &Path::result)
.def("findPathFromTo", &Path::findPathFromTo);

class_<Position>("Position")
.def(init<float, float, float>())
.def_readwrite("x", &Position::x)
.def_readwrite("y", &Position::y)
.def_readwrite("z", &Position::z);
};

我调用

import map
path = map.Path()
path.findPathFromTo(2, 3, 34 ,34)
path.resultPath

最后一行抛出异常

TypeError: No Python class registered for C++ class std::list<Position, std::allocator<Position> >

最佳答案

既然你要返回一个列表,你应该公开它:

class_<std::list<Position>>("list_position")
.def("__iter__", iterator<std::list<Position> >())
;

然后你可以遍历元素:

import map
path = map.Path()
path.findPathFromTo(2, 3, 34 ,34)
for p in path.resultPath: # is resultPath a std::list<Position>? I'm supposing YES.
print p.x, p.y, p.z

正如您在@janne-karila 指出的链接中注意到的那样,可以改进 python 与 std::list 交互的方式,提供清除、追加、删除等列表元素的方法。如果您想使用索引访问元素,我建议您使用 std::vector (这只是一个建议,不确定它是否适合您的需求)。

关于c++ - 如何从 python 中包装的 c++ 类中读取列表<对象>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20632288/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com