Template-Parameterized Variadic isInstaceOf

"Nordlöw" via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Fri Aug 7 07:45:42 PDT 2015


On Friday, 7 August 2015 at 14:30:55 UTC, Nordlöw wrote:
> Any suggestions on adding support for `binaryFun!pred` aswell?

I cracked it.

template isSortedRange(T, alias pred = "a < b")
{
     import std.traits : TemplateArgsOf;

     static if (TemplateArgsOf!T.length == 2)
     {
         import std.functional : binaryFun;

         alias predArg = TemplateArgsOf!T[1];
         static if (isSomeString!(typeof(pred)))
         {
             alias predFun = binaryFun!pred;
         }
         else
         {
             alias predFun = pred;
         }

         static if (isSomeString!(typeof(predArg)))
         {
             alias predArgFun = binaryFun!predArg;
         }
         else
         {
             alias predArgFun = predArg;
         }

         enum isSortedRange = (is(T == SortedRange!Args, Args...) 
&&
                               is(typeof(predFun) == 
typeof(predArgFun)));
     }
     else
     {
         enum isSortedRange = false;
     }
}

///
unittest
{
     import std.functional : binaryFun;

     alias R = int[];
     enum pred = "a < b";

     alias SR = SortedRange!(R, pred);
     static assert(isSortedRange!(SR, pred));
     static assert(isSortedRange!(SR, binaryFun!pred));

     alias SR2 = SortedRange!(R, binaryFun!pred);
     static assert(isSortedRange!(SR2, pred));
     static assert(isSortedRange!(SR2, binaryFun!pred));
}

Comments, please.


More information about the Digitalmars-d-learn mailing list