On Sunday, 1 July 2018 at 01:48:15 UTC, Simen Kjærås wrote:

I'd send you straight to std.meta.ApplyLeft, but it seems to do the wrong thing here, in that it doesn't handle IFTI. This thing does:

void fooImpl(int n, T)(const T line) { }

unittest {
    alias fun = applyLeft!(fooImpl, 3);
    fun(`aaa`);
    applyLeft!(fooImpl, 3)(`aaa`);
}

template applyLeft(alias Fn, T...) {
    auto applyLeft(U...)(U args) {
        return Fn!T(args);
    }
}

Would be nice if std.meta.ApplyLeft did the job here.. Is there no way of achieving that?
It's current implementation looks like this:

template ApplyLeft(alias Template, args...)
{
alias ApplyLeft(right...) = SmartAlias!(Template!(args, right));
}

private template SmartAlias(T...)
{
    static if (T.length == 1)
    {
        alias SmartAlias = Alias!T;
    }
    else
    {
        alias SmartAlias = AliasSeq!T;
    }
}

Would have to find a way to determine whether Template would resolve to a function or not. Can't find anything in Traits[1] or std.traits[2]. Template inspection looks rather limited : /.

[1]: https://dlang.org/spec/traits.html
[2]: https://dlang.org/phobos/std_traits.html



Reply via email to