Rely on T.size() instead of distance(T.begin(), T.end()) to get the
container size. Add a special case for C-style arrays with known size.
In some cases, gcc-4.9 fails to optimize distance(...) on an array<T, N>
of unknown base address, leading to a bogus compile failure. Switching
the object to have a known address prevents the problem, but requires
changing the calling code. Switch to using T.size(), which gcc seems to
get right.