Это будет беспокойство и ад, чтобы поддерживать.
Обычно я бы посоветовал использовать numeric_limits
:
template <class D, class S>
D SafeConvert(S value)
{
ASSERT(value >= std::numeric_limits<D>::min()
&& value <= std::numeric_limits<D>::max());
return static_cast<D>(value);
}
Однако компилятор выдает предупреждение, когда вы сравниваете целое число со знаком с беззнаковым ... (кстати, никогда не понимал этого)
Таким образом, вместо того, чтобы заново изобретать колесо, я посоветую использовать Boost.NumericConversion , а именно: boost::numeric_cast<>
.
Гарантируется отсутствие производительности, когда проверка не требуется (т. Е. Тип назначения больше, чем тип источника), а в противном случае выполняйте необходимые проверки.