Emscripten传递stl c ++ map参数

问题描述 投票:1回答:1

我无法弄清楚如何为以下函数调用JS生成的代码:

void printmap(const map<string, vector<string> > &ms)
{
    map<string, vector<string> >::const_iterator m1i;
    for (m1i = ms.begin(); m1i != ms.end(); m1i++)
    {
        printf("%s:\n", m1i->first.c_str());
        vector<string>::const_iterator m2i;
        for (m2i = m1i->second.begin(); m2i != m1i->second.end(); m2i++)
            printf("\t%s\n", m2i->c_str());
    }
}

更具体地说,JS看起来准备'ms'参数是什么意思?

emscripten
1个回答
0
投票

你不能在JS中调用你的printmap()

WebAssembly目前defines number types only:32 / 64bit整数/浮点数。由于这个限制,Emscripten编译的WASM代码可以通过以下类型与JS交互:

  1. 数字类型(整数和浮点数)
  2. 指针类型(通过将整数与WASM内存地址0x00000000的偏移量处理) 字节(或整数)数组的指针 一个字符串的指针(虽然它isn't simple) 类实例的指针(通过Embind

我不知道如何,但指针和引用表现不同,thus you cannot use a reference type to interact with JS

正如你在这里猜测的那样,没有办法操纵像map<string, vector<string>这样复杂的C ++类型。

总结一下,我有几点建议:

  1. 将引用类型更改为指针。

void printmap(const map<string, vector<string> > &ms)

void printmap(const map<string, vector<string> > *ms)

  1. ms编写一个init函数,以便在JS中执行类似的操作:
let map_ptr = module._initmap();
...Do something..
module._printmap(map_ptr);
  1. 只是避免直接在JS端使用这种复杂的C / C ++类型,或者为ms制作getter和setter函数。
© www.soinside.com 2019 - 2024. All rights reserved.