Вызов функции JavaScript в C ++ с emscripten embind

Этот вопрос состоит из двух частей. Что я хочу сделать, так это поместить большую часть моей программной логики в классы c ++, а некоторые функции, связанные с представлениями, в js (например, манипуляции с DOM и стилизация). Я использую emscripten embind для классов, и он отлично работает, пока я не знаю, как взаимодействовать с кодом hte js (их учебник действительно ограничен).

Я думал передать объект val классу C ++ в соответствии с их руководством (https://github.com/kripken/emscripten/wiki/Tutorial) Передача работает просто отлично, в то время как функция «call» не работает. Я получил ошибку во время компиляции

Вот пример, который я попробовал, который они поставили в своем уроке

#include <emscripten/val.h>
using namespace emscripten;

int main(){
val Math = val::global("Math");
Math.call("abs",-10);
return 0;
}

и я получил следующие ошибки:
ошибка: нет соответствующей функции-члена для вызова ‘call’
Math.call ( «абс», — 10);
~~~~ ^ ~~~
emscripten / 1.5.6 / system / include / emscripten / val.h: 247: 21: примечание: шаблон кандидата проигнорирован: не удалось вывести аргумент шаблона «ReturnValue»
Вызов ReturnValue (const char * name, Args&&… args) const {

В основном это говорит о том, что компилятор не знает тип возвращаемого значения функции «call».
Я сделал что-то не так или есть лучший способ взаимодействия с кодом JS?

Спасибо,
уг

2

Решение

Это распространенная проблема C ++. Как правило, следующее сообщение всегда должно вызывать двойную проверку в C ++:

note: candidate template ignored: couldn't infer template argument 'ReturnValue' ReturnValue call(const char* name, Args&&... args) const

В основном это означает, что вы пытались вызвать шаблонную функцию, но не указали необходимые типы.

Если вы посмотрите на подпись (в system/include/emscripten/val.h):

template<typename ReturnValue, typename... Args>
ReturnValue call(const char* name, Args&&... args) const

Хотя это может сделать вывод Args довольно хорошо, он понятия не имеет, что ReturnValue возможно. Поэтому вызов этой функции должен быть сделан, например, через:

Math.call<int>("abs",-10);
4

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector