Where does the template parameter E come from?

simendsjo simen.endsjo at pandavre.com
Mon Mar 28 08:05:04 PDT 2011


On 28.03.2011 16:54, simendsjo wrote:
> 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;
> }
> }

I think I get it.

doIt becomes the function being called. So E is the type of the 
parameter being used when calling compose.


More information about the Digitalmars-d-learn mailing list