On Wednesday, 14 November 2018 at 16:06:21 UTC, Chris Bare wrote:
If I have:
class base
{
    void delegate(base) stored_dg;

    void
    add_function (void delegate (base) dlg)
    {
        stored_dg = dlg;
    }
}

class A : base
{
    this ()
    {
        super ();
        add_function (&this.foo);
    }

    void foo (A a)
    {
        log ("i got here");
    }
}

it fails because foo(A) does not match the parameter type of delegate(base)

If I change foo (A a) to foo (base a)

It works, but this could be awkward in a deeper class hierarchy where you
might not know the class name to use.

Is there a way to do this where foo's parameter type does not to match the
class that implements add_function?

Thanks,
Chris

Are you looking for this?
https://dlang.org/phobos/std_traits.html#TransitiveBaseTypeTuple

It matches however not exactly your needs:
As all objects are derived from the Object class, you will always get it as the common parent. So... with the trait, you get a list but have still to make a decision which type to use.

Reply via email to