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