On Wednesday, 20 January 2016 at 00:12:16 UTC, Ali Çehreli wrote:
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

I think I've reduced my case too much: the wrapper needs to be generic so that I can do something like this (basically a closure but compile time)

void wrapper(minus) {
    alias appendMinus(S,T) = appendMapped!(minus, S, T);
    assert (appendMinus(ar, 10) == [-10]);
}

Anyway, thanks for help Ali, love your book:)

Reply via email to