Template argument deduction from a function call question

Ali Çehreli via Digitalmars-d digitalmars-d at puremagic.com
Wed Apr 1 11:37:24 PDT 2015


On 04/01/2015 11:27 AM, Dzugaru wrote:

 > This code does work when you provide second (non-default) argument to
 > function, and doesn't if you do not (no way it can deduce E solely from
 > checks I assume).
 >
 > My version, in constract, works when you do not provide second argument
 > and doesn't if you do.

Another attempt:

import std.range;

ElementType!S
aggregate(alias func, S, E = ElementType!S)(S list, E accum = E.init)
     if(is(typeof(func(accum, accum)) == typeof(accum)))
{
     foreach(ref e; list) {
         accum = func(accum, e);
     }

     return accum;
}

void main()
{
     auto min1 = aggregate!((a,  b) { return a < b ? a : b; 
})([2,4,1,3,5], int.max);
     auto min2 = aggregate!((a,  b) { return a < b ? a : b; })([2,4,1,3,5]);

     assert(min1 == 1);
     assert(min2 == 0);
}

Ali



More information about the Digitalmars-d mailing list