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.