2

我正在使用 std::array 为最短路径函数定义 2D 点。

typedef std::array<double, 2> point_xy_t;
typedef std::vector<point_xy_t> path_t;
path_t search(const point_xy_t& start, const point_xy_t& goal);

目前,我最好的解决方案是将点( std::array )转换为 std::vector,并使用 boost::python::vector_indexing_suite 作为:

bpy::class_<std::vector<double> >("Point")
    .def(bpy::vector_indexing_suite<std::vector<double> >())
;
bpy::class_<std::vector<std::vector<double>> >("Path")
    .def(bpy::vector_indexing_suite<std::vector<std::vector<double>> >())
;

是否可以直接从/到 std::array 到/从 python 索引或转换?

4

1 回答 1

4

为了让它看起来像蟒蛇,我会使用boost::python::extract,tuplelist's 的组合。这是一个草图:

static bpy::list py_search(bpy::tuple start, bpy::tuple goal) {
  // optionally check that start and goal have the required
  // size of 2 using bpy::len()

  // convert arguments and call the C++ search method
  std::array<double,2> _start = {bpy::extract<double>(start[0]), bpy::extract<double>(start[1])};
  std::array<double,2> _goal  = {bpy::extract<double>(goal[0]), bpy::extract<double>(goal[1])};
  std::vector<std::array<double,2>> cxx_retval = search(_start, _goal);

  // converts the returned value into a list of 2-tuples
  bpy::list retval;
  for (auto &i : cxx_retval) retval.append(bpy::make_tuple(i[0], i[1]));
  return retval;
}

然后绑定将如下所示:

bpy::def("search", &py_search);
于 2013-08-21T14:24:47.390 回答