Template argument deduction from a function call question

Dzugaru via Digitalmars-d digitalmars-d at puremagic.com
Wed Apr 1 11:46:47 PDT 2015


On Wednesday, 1 April 2015 at 18:37:24 UTC, Ali Çehreli wrote:
> 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

This is perfect, many thanks. Didn't know I can use "=" in 
template parameter list.


More information about the Digitalmars-d mailing list