On Wednesday, 19 February 2014 at 22:46:45 UTC, Chris Williams wrote:
When the template writes out the definition of the function, if the parameters can be interpreted during compile-time, then the foreach ( O(n) ) will be run by the compiler to detect the correct parameter and the function will be written out as just as a return statement in the body, without the loop. So during runtime, the function would have an O(1) runtime.
That's an optimization the compiler may do, but it's not guaranteed. And `among` is not special in this regard. [...]
The version which accepts three parameters will always run the same speed no matter what you call it - since it does the same thing exactly three times.
Well, it returns as soon as the value is found. So among(v, "b", "c") finishes quicker when v is "b" than when it's "c" or "a". It only does the same thing three times when it didn't find the value after two times.