On 3/13/18 12:50 PM, Yuxuan Shui wrote:
On Tuesday, 13 March 2018 at 14:40:21 UTC, Steven Schveighoffer wrote:
On 3/13/18 10:25 AM, Yuxuan Shui wrote:
[...]


This has been discussed before. There are a few ways around this. One is to do what you did. Another is to append a sentinel, or use id to terminate the loop:

foreach(id, R; S) {
    static if(is(T == R))
        return id;
    else static if(id + 1 == S.length)
        return -1;
}

Wait, I don't understand how this works.

Isn't this going to be expanded to something like:

return 0;
return 4;
// One return for every match
....
return -1;

Shouldn't this trigger unreachable warning too?

Yes, it's going to trigger one return for every match, and the return for -1.

But there is something special about an unrolled foreach. Notice, it's NOT a static foreach. A static foreach would result in the same problem.

An unrolled foreach on a tuple has a notion that the flow control jumps out of the loop, and it's OK to skip further loops (even though they are technically unrolled).

This works for break and continue as well. It's a very convoluted notion, one that is hard to grasp and explain.

In any case, the better solution would be if the compiler turned off the "unreachable statement" detection when it encountered a static if based on template parameters.

-Steve

Reply via email to