Type deduction using switch case

Nick Sabalausky a at a.a
Sat Feb 18 17:47:16 PST 2012


"Xinok" <xinok at live.com> wrote in message 
news:yeuigezlevjbhgufwrti at forum.dlang.org...
> While reading "The Right Approach to Exceptions", it gave me this idea. 
> The user would declare a list of variables of different types as case 
> statements, and the variable with matches the type of the switch 
> expression is used.
>
> I don't know how the syntax should look, this is merely an example:
>
> void foo(T)(T arg){
> switch(arg){
> case int i:
> writeln("Type is int ", i); break;
> case float f:
> writeln("Type is float ", f); break;
> case string s:
> writeln("Type is string ", s); break;
> default:
> writeln("Type is unknown"); break;    }
> }
>
> While static if would be more practical for templates, my idea could be 
> extended to dynamic upcasting of classes as well, which could be applied 
> to exception handling:
>
> try{ ... }
> catch(Throwable err) switch(err){
> case IOError a:
> break;
> case OutOfMemoryError b:
> break;
> default:
> throw err;
> }

Yea, pattern matching, basically. Great as D is, pattern matching is one 
thing where Nemerle blows D out of the water: 
http://nemerle.org/Grok_Variants_and_matching

With exceptions in particular, I've often felt that we need some sort of 
templated catch:

try {...}
catch(TypeTuple!(ExceptionA, ExceptionB) e)
{
    // Common implementation, but NO need
    // for that re-throwing abomination you'd
    // inevitably need if you just caught
    // a common base type.
}




More information about the Digitalmars-d mailing list