Я хотел бы написать заголовок функции, который возвращает первое значение массива с сигнатурой типа (arr: T[]) => T
(Машинописный псевдокод).
Идея состоит в том, чтобы скомпилировать функцию C ++ в WebAssembly с использованием Emscripten и использовать эту функцию head в моем приложении javascript.
Я знаю, что шаблон C ++ обеспечит правильный инструмент для такой абстракции, но мне интересно, будут ли шаблоны работать так, как они работают во время компиляции.
PS: я новичок в C ++, любая ссылка на любой ресурс приветствуется, я хотел бы узнать.
WebAssembly не поддерживает «общие» или «шаблоны» как таковые, он имеет только типы i32
, i64
, f32
, а также f64
,
В чистом C ++ это хорошо, потому что ваш компилятор просто создаст экземпляры всех необходимых вам специализаций шаблонов, а затем использует их в WebAssembly. Если вы взаимодействуете между языками (например, C ++ в WebAssembly для JavaScript или TypeScript), то вы можете явно специализироваться ваши шаблоны и экспортировать их из вашего .wasm
файл, так что JavaScript / TypeScript может вызвать эту специализацию. Конечно, это означает, что вы должны знать, что вам нужно заранее!
Одна вещь, которую вы могли бы сделать, но совершенно непрактична, это как раз вовремя генерировать .wasm
файл во время выполнения, когда вы выясните, какой экземпляр шаблона вам действительно нужен. Это нецелесообразно, потому что инструментарий просто не существует прямо сейчас, вам понадобятся хотя бы части компилятора C ++, работающие в WebAssembly, а затем вам нужно будет исправить WebAssembly.Table
во время выполнения (что вполне выполнимо … просто не активно делается в эти дни).
Хотя для вашего конкретного варианта использования (верните первый элемент массива) я не уверен, что вы можете сделать многое! Поскольку типы WebAssembly настолько ограничены, вы можете иметь дело только с вещами, которые вписываются в 32 или 64 бит, если вы должен пройти через параметры. Даже в этом случае ваш массив не может быть просто расширен до аргументов, потому что количество параметров WebAssembly предопределено во время компиляции (привязка их к JavaScript может сбрасывать / getValue
на них, но вы действительно не хотите этого). То, что вы хотите, вероятно, чтобы передать вещи через Memory
, который похоже на работу со строками (в этой строке массив символов).
Других решений пока нет …