[Issue 21690] Unable to dynamic cast extern(C++) classes

d-bugmail at puremagic.com d-bugmail at puremagic.com
Thu Mar 11 00:22:20 UTC 2021


https://issues.dlang.org/show_bug.cgi?id=21690

--- Comment #9 from Basile-z <b2.temp at gmx.com> ---
dynamic cast of c++ classes can work to a **very** limited extent that is if
the target type is **exactly** the same (i.e not one of its derivate). This can
be done by comparing the virtual table address of the instance with the virtual
table address of the target type.

---
extern(C++) class A     { void f(){}}
extern(C++) class B : A { override void f(){} }
extern(C++) class C : A { }

extern(C++) T dyncast(T, U)(U u)
{
    const void* u_vtbl = *(cast(void**) u);
    const void* t_vtbl = &T.classinfo.vtbl[0];
    return t_vtbl is u_vtbl ? cast(T) u : null;
}

void main(string[] args)
{
    B b = new B;
    A a = b;
    C c = new C;

    assert(  dyncast!(B)(a) );
    assert( !dyncast!(B)(c) );
}  
---

But in now way D CastExp does that for now.

--


More information about the Digitalmars-d-bugs mailing list