template <typename Numeric, bool IsInteger = std::is_integral<Numeric>::value, bool IsFloat = std::is_floating_point<Numeric>::value>
struct UnsignedOrFloatForSize
This is used for UnsignedAbs, where we need to support floating-point
template instantiations even though we don't actually support the operations.
However, there is no corresponding implementation of e.g. SafeUnsignedAbs,
so the float versions will not compile.