Andrei Alexandrescu wrote: > I was coding a simple Euclidean distance function with limit: > > double euclideanDistance(Range)(Range a, Range b, double limit) > { > limit *= limit; > double result = 0; > for (; !a.empty; a.next, b.next) > { > enforce(!b.empty); > auto t = a.head - b.head; > result += t * t; > if (result >= limit) goto thatsit; > } > enforce(b.empty); > thatsit: > return sqrt(result); > } > > How would an elegant goto-less approach look like? It should not > duplicate code, e.g. the call to sqrt. > > > Andrei
How about: > double euclideanDistance(Range)(Range a, Range b, double limit) { limit *= limit; double result = 0; for (; !a.empty; a.next, b.next) { enforce(!b.empty); auto t = a.head - b.head; result += t * t; if (result >= limit) { b.clear; break; } } enforce(b.empty); return sqrt(result); }