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