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.
