Partial application of compile time args type deduction

Ali Çehreli via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Tue Jan 19 16:12:16 PST 2016


On 01/19/2016 03:37 PM, QAston wrote:
> Hi,
>
> I have the following code:
>
> auto appendMapped(alias f, R, T)(R r, T elem) {
>      r ~= f(elem);
>      return r;
> }
>
> int minus(int i) {
>      return -i;
> }
>
> unittest {
>      int[] ar;
>          // here I do partial application of minus function
>      alias appendMinus(S,T) = appendMapped!(minus, S, T);
>      assert (appendMinus!(int[], int)(ar, 10) == [-10]); // compiles
>      assert (appendMinus(ar, 10) == [-10]); // doesn't compile
> }
>
> Which gives me following error:
> Error: template transduced.__unittestL111_2.appendMinus cannot deduce
> function from argument types !()(int[], int), candidates are:
> transduced.__unittestL111_2.appendMinus(S, T)
>
> Is there a way to do partial template arg application which does
> template type deduction correctly?

I don't know whether it's possible with 'alias' but the following 
trivial wrapper works:

     auto appendMinus(S,T)(S s, T t) {
         return appendMapped!minus(s, t);
     }

Ali



More information about the Digitalmars-d-learn mailing list