On Friday, 15 July 2016 at 15:04:22 UTC, Devin Hill wrote:


to the condition. It works pretty well! Granted, it doesn't allow for calling it in two ways like a variadic version would have:

foo(1, 2, 3)   // works with this setup
foo([1, 2, 3]) // doesn't, but would only be occasionally useful anyway

but all in all it's a decent workaround for the problem.

It isn't too much effort to add support for both:

```
import std.traits : isArray, ForeachType;
import std.stdio : writeln;

void func(Args...)(Args args)
if(is(Args[0] : long) || (isArray!(Args[0]) && is(ForeachType!(Args[0]) : long)))
{
    static if(isArray!(Args[0])) {
        foreach(i; args[0])
            writeln(i);
    }
    else {
        foreach(arg; args)
            writeln(arg);
    }
}

void main()
{
    func(10, 20, 30, 40);
    func([1, 2, 3, 4, 5]);
}
```

Or, alternatively, to support multiple arrays:

```
void func(Args...)(Args args)
if(is(Args[0] : long) || (isArray!(Args[0]) && is(ForeachType!(Args[0]) : long)))
{
    foreach(arg; args) {
        static if(isArray!(Args[0])) {
            foreach(i; arg) writeln(i);
        }
        else writeln(arg);
    }
}

void main()
{
    func(10, 20, 30, 40);
    func([1, 2, 3, 4, 5], [100, 200, 300, 400]);
}
```

Reply via email to