我想编写一个函数头,它返回一个带有类型签名(arr: T[]) => T
(Typescript伪代码)的数组的第一个值。
我的想法是使用Emscripten将C ++函数编译为WebAssembly,并在我的javascript应用程序中使用此head函数。
我知道C ++模板可以为这种抽象提供合适的工具,但我想知道模板是否可以在编译时运行。
PS:我是C ++初学者,欢迎任何任何资源的链接,我想学习。
答案 0 :(得分:2)
WebAssembly本身不支持“泛型”或“模板”,它只有i32
,i64
,f32
和f64
类型。
在纯C ++中,这很好,因为您的编译只会实例化您需要的所有模板特化,然后在WebAssembly中使用它们。如果您跨语言互操作(比如WebAssembly中的C ++到JavaScript或TypeScript),那么您可以explicitly specialize模板并从.wasm
文件中导出它们,以便JavaScript / TypeScript可以调用该专业化。当然这意味着你必须事先知道你需要什么!
你可以做的一件事,但是完全不切实际,当你弄清楚你真正需要什么样的模板实例时,就是在运行时及时生成.wasm
文件。这是不切实际的,因为工具现在不存在,你至少需要在WebAssembly中运行的C ++编译器的一部分,然后你需要在运行时修补你的WebAssembly.Table
(这是完全可行的..这些天没有积极完成。)
对于您的特定用例(返回数组的第一个元素),我不确定您可以做多少!由于WebAssembly的类型非常有限,因此如果必须作为参数传递,则只能处理符合32位或64位的内容。即使这样,你的数组也不能只是一般地扩展到参数,因为WebAssembly参数计数是在编译时预先确定的(将它们绑定到JavaScript可以放弃/ getValue
,但你真的不想这样做。你想要的可能是通过Memory
传递信息,similar to dealing with strings(在字符串中是一个字符数组)。