I'm using the "Non-abstract virtual methods" approach (i.e. with 
*optional_override()*) to allow my JavaScript code to subclass a C++ class 
and receive callback methods on it.  This works okay, but currently my 
JavaScript code needs to maintain a Map from each JavaScript-object to its 
associated C++-object (as returned by *implement()*) in order to call 
methods on the C++ superclass, and that seems like an unnecessary burden to 
place on the JavaScript programmer.

What I'd like to do instead is pass the C++ "this" pointer to the 
JavaScript callback method, so that the JavaScript callback method can 
access it directly without any external bookkeeping.  Something like the 
code at the bottom of this post.

However, when I try it, I get a static_assert failure when compiling the 
C++ bindings: 


*static assertion failed due to requirement 
'!std::is_pointer<ISomeInterfaceClass*>::value': Implicitly binding raw 
pointers is illegal.  Specify allow_raw_pointer<arg<?>>  117 |     
static_assert(!std::is_pointer<T*>::value, "Implicitly binding raw pointers 
is illegal.  Specify allow_raw_pointer<arg<?>>");*

My question is, how can I specify *allow_raw_pointer<arg<0>>* in a *call<>* 
call?  Or is there another elegant/idiomatic way to do what I want to do, 
that I should be using instead?

Thanks,
Jeremy

-----

class ISomeInterfaceClass
{
public:
   virtual void SomeCallbackMethod() {/* empty */}

   void DoSomethingElse() {...}
};

struct ISomeInterfaceClassWrapper : public wrapper<ISomeInterfaceClass>
{
   EMSCRIPTEN_WRAPPER(ISomeInterfaceClassWrapper);

   virtual void SomeCallbackMethod() {call<void>("SomeCallbackMethod", 
this);}  // Trying to pass the this-pointer causes a static_assert failure!
};

EMSCRIPTEN_BINDINGS(ISomeInterfaceClassWrapper)
{
   class_<ISomeInterfaceClass>("ISomeInterfaceClass")
      
.allow_subclass<ISomeInterfaceClassWrapper>("ISomeInterfaceClassWrapper", 
constructor<IAutomationUpdateGateway*>())
      .function("SomeCallbackMethod", 
optional_override([](ISomeInterfaceClass& self) {return 
self.ISomeInterfaceClass::SomeCallbackMethod();}))
}


// JavaScript code
var myJavaScriptSubclassObject =
{
   SomeCallbackFunction : function(cppThis)
   {  
      console.log("SomeCallbackFunction was called!");
      cppThis.DoSomethingElse();
   }
};

var mySubclassObject = 
Module.ISomeInterfaceClass.implement(myJavaScriptSubclassObject);
[...]

-- 
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].
To view this discussion visit 
https://groups.google.com/d/msgid/emscripten-discuss/f97e8e85-7158-45dc-9a60-330bec765784n%40googlegroups.com.

Reply via email to