如何桥接 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"这些以访问其数据。
但它确实公开了 get
和 size
函数来访问向量:
console.log('Back from C++', result.size(), result.get(0).get(1));
(双 get
是因为我们要返回向量的向量)
为了完整性,查看返回对象的原型,似乎公开了以下功能。
get
push_back
resize
set
size
它公开了 get
和 set
函数,而不是与 C++ at
function. I suspect that it's not possible for an exactly equivalent function since at
returns 等效的函数,这有点不一致,允许它用作 setter,这在 Javascript.
中是不可能的
在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"这些以访问其数据。
但它确实公开了 get
和 size
函数来访问向量:
console.log('Back from C++', result.size(), result.get(0).get(1));
(双 get
是因为我们要返回向量的向量)
为了完整性,查看返回对象的原型,似乎公开了以下功能。
get
push_back
resize
set
size
它公开了 get
和 set
函数,而不是与 C++ at
function. I suspect that it's not possible for an exactly equivalent function since at
returns 等效的函数,这有点不一致,允许它用作 setter,这在 Javascript.