On 07/27/15 14:03, Vlad Leberstein via Digitalmars-d-learn wrote: > Hi! My use case requires interaction with C API which in turn implies storing > object instance reference as void *. I'm using gdc 4.9.2 and everything > worked fine with "object -> void * -> object" conversion, but "object -> void > * -> interface" failed. The stripped-down example is something like this: > > interface TestInterface { > void testMethod(); > } > > class TestImpl : TestInterface { > void testMethod() { > writefln("TestImpl::testMethod\n"); > } > }; > > void testDispathcer(void *rawSelf) { > auto self = cast(TestInterface) rawSelf; > // nothing happens > self.testMethod(); > } > > > int main(string[] args) { > auto t = new TestImpl(); > testDispathcer(cast(void *) t); > return 0; > }
> Is there any way to handle such situation without resorting to templating > dispatcher with every *Impl type? auto self = cast(TestInterface)cast(Object) rawSelf [you should probably check for null, and consider using a reinterpret-cast (`testDispathcer(*cast(void **)&t)`) because a "normal" one can be overridden by the class, sometimes accidentally] artur