Fallback 'catch-all' template functions

Dominikus Dittes Scherkl via Digitalmars-d digitalmars-d at puremagic.com
Thu Sep 1 03:43:50 PDT 2016


On Thursday, 1 September 2016 at 05:37:50 UTC, Manu wrote:
> So, consider a set of overloads:
>
>   void f(T)(T t) if(isSomething!T) {}
>   void f(T)(T t) if(isSomethingElse!T) {}
>   void f(T)(T t) {}
>
> I have a recurring problem where I need a fallback function 
> like the bottom one, which should be used in lieu of a more 
> precise match. This is obviously an ambiguous call, but this is 
> a pattern that comes up an awful lot. How to do it in D?
>
> I've asked this before, and people say:
>
>   void f(T)(T t) if(!isSomething!T && !isSomethingElse!T) {}
>
> Consider that more overloads are being introduced by users 
> spread out across many modules that define their own kind of T; 
> this solution is no good.

Simply
void f(T)(T t)
{
    static if(isSomething!T)
    {
    }
    else static if(isSomethingElse!T)
    {
    }
    else
    {
    }
}

I personally hate overloads, especially if the condition has a 
fallback, so I like to see no condition in the function 
signature, what makes for a much cleaner API.
I have never seen what benefit could be gained from having 
overloads. I think they are a relict from languages without 
static if.


More information about the Digitalmars-d mailing list