Both are possible, but I'd say val is the best option. I did not test it, but it seems to me that since val has an operator(), it can be used as a functor, and thus be directly passed as an std::function. Otherwise, it is easy to create a lambda that will call it.
Le lundi 17 juillet 2017 17:44:18 UTC+2, Vangelis Ts. a écrit : > > Thank you very much for your response, Alexandre. 🙂 > > Passing functions from JS to call later on from C++ is exactly what I am > trying to do. I suspect that *emscripten::val* is the only way ―or is it > also possible by using *std::function*? > > In any case, my C++ library uses *std::function* internally and (ideally) > I would like to avoid making changes to the code that calls the callbacks. > Is there the ability to "translate" an *emscripten::val* to > *std::function*, in order to transparently pass the callbacks to the rest > C++ code? > > > On Monday, July 17, 2017 at 10:24:49 AM UTC+3, Alexandre Perrot wrote: >> >> Hi, >> >> std::functions are not bound by default, you need to do that yourself. >> >> Have a look at l.1775 of embind_test.cpp >> >> https://github.com/kripken/emscripten/blob/master/tests/embind/embind_test.cpp#L1775 >> >> This registers an std::function as a class, with the opcall method >> binding the c++ () operator. >> >> Alternatively, you could use an emscripten::val to pass a function from >> js. >> >> Le lundi 10 juillet 2017 14:58:08 UTC+2, Vangelis Ts. a écrit : >>> >>> Hello, >>> >>> I am trying to use a simple C++ program containing using *std::function* >>> with >>> Embind. However, the latter does not seem to recognize *std::function*. >>> >>> More specifically, here is the example I used: >>> >>> *Foo.cpp* >>> >>> >>> #include <functional> >>> #include <emscripten/bind.h> >>> >>> using namespace emscripten; >>> >>> int bar(std::function<int(int)> func, int num) { >>> return func(num); >>> } >>> >>> EMSCRIPTEN_BINDINGS(Foo) { >>> function("bar", &bar); >>> } >>> >>> >>> *Foo.html* >>> >>> >>> <!doctype html> >>> <html> >>> <script src="foo.js"></script> >>> <script> >>> console.log('Foo: ' + Module.bar); >>> </script> >>> </html> >>> >>> >>> *Compilation* >>> >>> >>> *$* emcc --bind foo.cpp -o foo.js >>> >>> >>> The compilation succeeds with no errors or warnings. >>> >>> *Result* >>> >>> >>> <https://lh3.googleusercontent.com/-cbSwX8ZiNag/WWNzyjMIwsI/AAAAAAAAKUA/06dRJmG-0C4b3_jHxB1c_Eu1Mny5947ZQCLcBGAs/s1600/Screen%2BShot%2B2017-07-10%2Bat%2B14.57.05.png> >>> >>> >>> I also tried to compile and/or run the test files of Embind (see >>> embind_test.cpp >>> <https://github.com/kripken/emscripten/blob/master/tests/embind/embind_test.cpp> >>> and embind.test.js >>> <https://github.com/kripken/emscripten/blob/master/tests/embind/embind.test.js>), >>> >>> which also contain function that use *std::function* (e.g. >>> emval_test_get_function_ptr >>> (definition) >>> <https://github.com/kripken/emscripten/blob/master/tests/embind/embind_test.cpp#L153> >>> / emval_test_get_function_ptr (binding) >>> <https://github.com/kripken/emscripten/blob/master/tests/embind/embind_test.cpp#L1780>), >>> >>> with exactly the same command and they *do work fine*: >>> >>> *Result* >>> >>> >>> <https://lh3.googleusercontent.com/-9Cn4jyhAPzg/WWN1pN3B8TI/AAAAAAAAKUQ/x_t2dM-qyi8n6hTcIf968IQSaxmfFxoDACLcBGAs/s1600/Screen%2BShot%2B2017-07-10%2Bat%2B14.56.02.png> >>> >>> *Generated source code* >>> >>> >>> <https://lh3.googleusercontent.com/-80B9SjRLHME/WWN16hbcMCI/AAAAAAAAKUU/ZzP2QEes3Pk0gacNafhtMMgyUAazTTEkwCLcBGAs/s1600/Screen%2BShot%2B2017-07-10%2Bat%2B14.55.53.png> >>> >>> I should also mention that I tried many different combinations, e.g. >>> *std::function* with different types, as return type, as argument, as >>> an independent function (like in the above example), as a class or struct >>> method, but had no luck. >>> >>> Any ideas would prove of great help. >>> >>> Thank you very much, in advance. >>> >>> >>> ― Vangelis >>> >> -- You received this message because you are subscribed to the Google Groups "emscripten-discuss" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. For more options, visit https://groups.google.com/d/optout.
