我用c ++包装了类并暴露给python,当我调用函数成员时它工作,问题是我无法访问数据(类Path中的公共成员结果有类型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> >
答案 0 :(得分:2)
由于您要返回一个列表,您应该公开它:
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(这只是一个建议,不确定它是否适合你的需要)。