On Monday, 6 May 2013 at 17:03:20 UTC, Luís Marques wrote:
I have a list of functions which receive values of different types, like in std.concurrency...

    // example from std.concurrency
    receive(
         (int i) { writeln("Received the number ", i);}
     );

...although in my case I can probably live by with only accepting objects.

I built a list of the handlers and the message classes they accept. My problem is that I don't know how to check if the message I have to dispatch is of the class the handler accepts *or a subclass*. I only managed to check for class equality:

    if(typeid(msg) == typeHandler.type)
    {
        typeHandler.handler(msg);
    }

How can I also accept subclasses?

Thanks,
Luís

Just cast it - http://dlang.org/expression.html#CastExpression
Casting object `foo` to type `Bar` will yield `null` if `foo` is not an instance of a `Bar` or of a subclass of `Bar`.

This is particularly usefull combined with a declaration inside an `if` statement:

    if(auto castedObject = cast(typeHandler.type)msg)
    {
        typeHandler.handler(msg);
    }

BTW, for this to work `typeHandler.type` needs to be known at compile-time.

Reply via email to