Where does the template parameter E come from?

simendsjo simen.endsjo at pandavre.com
Mon Mar 28 07:54:00 PDT 2011


When running compose with two arguments, the implementation uses the 
template parameter E. I don't understand what's going on here as E isn't 
submitted to the template - what type is E?
I've also seen this in unary/binaryFun using ElementType.


template compose(fun...) { alias composeImpl!(fun).doIt compose; }

// Implementation of compose
template composeImpl(fun...)
{
     static if (fun.length == 1)
     {
         static if (is(typeof(fun[0]) : string))
             alias unaryFun!(fun[0]) doIt;
         else
             alias fun[0] doIt;
     }
     else static if (fun.length == 2)
     {
         // starch
         static if (is(typeof(fun[0]) : string))
             alias unaryFun!(fun[0]) fun0;
         else
             alias fun[0] fun0;
         static if (is(typeof(fun[1]) : string))
             alias unaryFun!(fun[1]) fun1;
         else
             alias fun[1] fun1;
         // protein: the core composition operation
         typeof({ E a; return fun0(fun1(a)); }()) doIt(E)(E a)
         {
             return fun0(fun1(a));
         }
     }
     else
     {
         // protein: assembling operations
         alias composeImpl!(fun[0], composeImpl!(fun[1 .. $]).doIt).doIt 
doIt;
     }
}


More information about the Digitalmars-d-learn mailing list