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