在JavaScript中,我有一个"行"的列表,每个行包含无限数量的"点",每个点都有[x, y]
的形式。所以它是一个3D衣衫褴褛的阵列。现在我需要在emscripten(embind)的帮助下将它传递给我的C ++代码。这里是C ++函数的声明:
Eigen::MatrixXd f(const std::vector<std::vector<std::vector<double>>>& lines);
我希望在调用[[m11, m12],[m22, m22],...]
后在JavaScript中获取列表(f
)。在这种情况下如何编写绑定代码(例如EMSCRIPTEN_BINDINGS
内的东西)?
UPDATE :我现在可以将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
但返回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
有什么想法吗?
答案 0 :(得分:2)
从C ++函数传递embound向量时,例如
std::vector<std::vector<double>> f_wrapper(...);
到Javascript
var result = Module.f_wrapper(...);
result
对象不是实现length
属性或数组索引访问的Javascript数组,因此如果使用这些访问其数据,它可能显示为“空”。
但它确实公开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
函数的等价物。我怀疑完全等效的函数是不可能的,因为at
返回一个允许它用作setter的引用,这在Javascript中是不可能的。