如何桥接 JavaScript(参差不齐)数组和 std::vector<std::vector<T>> 对象?

How to bridge a JavaScript (ragged) array and an std::vector<std::vector<T>> object?

在JavaScript中我有一个"lines"的列表,每个列表由不定数量的"points"组成,每个[x, y]的形式。所以它是一个 3D 参差不齐的数组。现在我需要在 emscripten (embind) 的帮助下将它传递给我的 C++ 代码。这是 C++ 函数的声明:

Eigen::MatrixXd f(const std::vector<std::vector<std::vector<double>>>& lines);

并且我想在调用 f 后获得 JavaScript 中的列表列表 ([[m11, m12],[m22, m22],...])。这种情况下绑定代码怎么写(比如EMSCRIPTEN_BINDINGS里面的东西)?

更新:我现在可以将 JavaScript 数组传递给 C++。绑定部分类似于

typedef std::vector<double> Point;
typedef std::vector<Point> Line;
EMSCRIPTEN_BINDINGS(module) {
  register_vector<Line>("LineArray");
  register_vector<Point>("Line");
  register_vector<double>("Point");
  emscripten::function("f_wrapper", &f_wrapper);
}

其中 f_wrapper 调用 f 但 returns vector<vector<double>> 而不是 MatrixXd。现在的问题是我在调用f_wrapper后只能得到一个空的JavaScript对象。 JavaScript 是

var Module = require('./bind.js'); // the output of em++
var cppAllLines = new Module.LineArray();
// some initialization
var result = Module.f_wrapper(cppAllLines); // an empty "Line" object

有什么想法吗?

从 C++ 函数传递嵌入向量时,例如

std::vector<std::vector<double>> f_wrapper(...);

到Javascript

var result = Module.f_wrapper(...);

result 对象不是实现 length 属性 或数组索引访问的 Javascript 数组,因此如果使用它可以出现 "empty"这些以访问其数据。

但它确实公开了 getsize 函数来访问向量:

console.log('Back from C++', result.size(), result.get(0).get(1));

(双 get 是因为我们要返回向量的向量)

为了完整性,查看返回对象的原型,似乎公开了以下功能。

  • get
  • push_back
  • resize
  • set
  • size

它公开了 getset 函数,而不是与 C++ at function. I suspect that it's not possible for an exactly equivalent function since at returns 等效的函数,这有点不一致,允许它用作 setter,这在 Javascript.

中是不可能的