
On 12/14/15 1:01 PM, Rob Stewart wrote:
I showed a safe class template, below, that defaulted the min and max to those values, and you said that was "exactly what safe<T> is". If yours has those defaults, then there is no such tedium.
However, since min() and max() are now constexpr, that all can be collapsed into a single template with three parameterizing types: the underlying type, the minimum, and the maximum:
template < class T , T Min = std::numeric_limits<T>::min() , T Max = std::numeric_limits<T>::max() > class safe;
That's exactly what safe<T> is.
Why doesn't that suffice for all use cases?
Whoops, I read the above too fast. The reason is the we need to be able to specify policy classes for exception handling and type promotion. The actual template is template< class Stored, Stored Min, Stored Max, class P, // promotion polic class E // exception policy
safe_base; then we have template < class T, class P = native, class E = throw_exception
using safe = safe_base< T, std::numeric_limits<T>::min(), std::numeric_limits<T>::max(), P, E
;
and template < std::intmax_t MIN, std::intmax_t MAX, class P = native, class E = throw_exception
using safe_signed_range = safe_base<
typename detail::signed_stored_type
;
So it's really just a question of getting the default parameters correct for different usages. Robert Ramey