The template parameters for 'function' only seem to accept method pointers
for the given type, not for a parent type, so this kinda borks up even
though it feels like it *ought* to work to just pass in &Base::doSomething
here.

(It might be worth filing as an issue on github so it doesn't get
forgotten; seems like something that would come up at API boundaries.)


Try using a static_cast on the method pointer, from the base to the derived
type:

EMSCRIPTEN_BINDINGS(bindo) {
    emscripten::class_<Derived>("Derived")
        .constructor()
        .function("doSomething",
static_cast<void(Derived::*)()>(&Base::doSomething));
}

It's a little verbose, but seems to do the right thing and doesn't require
writing extra functions.

-- brion


On Thu, Dec 10, 2015 at 1:31 AM, Joshua Auerbach <[email protected]>
wrote:

> Let's say I have the following in C++
>
> class Base {
> public:
>     void doSomething() {
>         //do something here
>     }
> };
>
> class Derived : public Base {
> };
>
> And I want to expose Derived to js including the inherited method
> doSomething (a toy example illustrative of a bigger issue)
>
> Is this possible without also exposing Base?  Or do I really need to
> recreate the entire class hierarchy in my bindings?
>
> I know these bindings work:
>
> emscripten::class_<Base>("Base")
>     .function("doSomething", &Base::doSomething);
>
> emscripten::class_<Derived, emscripten::base<Base>>("Derived")
>     .constructor();
>
> But this does not:
>
> emscripten::class_<Derived>("Derived")
>     .constructor()
>     .function("doSomething", &Derived::doSomething)
>
> unless I change the C++ definition of Derived to
>
> class Derived : public Base {
> public:
>     void doSomething() { Base::doSomething(); }
> };
>
> I never want Base to be exposed to js just the inherited method.  Is there
> any way to expose those without recreating the hierarchy or making trivial
> overrides like I do above?
>
> Thanks!!!
> Josh
>
> --
> Dr. Joshua E. Auerbach
> Postdoctoral Researcher
> Laboratory of Intelligent Systems
> École Polytechnique Fédérale de Lausanne
>
> --
> 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.
>

-- 
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.

Reply via email to