Шаблон C ++ для безопасных целочисленных приведений
Я пытаюсь написать шаблонную функцию C ++, которая будет генерировать исключение времени выполнения при целочисленном переполнении при приведении между различными целочисленными типами, с различной шириной и возможным несоответствием со знаком или без знака. Для этих целей меня не интересует приведение типов с плавающей точкой к целочисленным типам или другие преобразования объектов в объекты. Я хотел бы сделать это без необходимости писать много кода для особых случаев. Вот что у меня сейчас есть:
template< typename T, typename R > void safe_cast( const T& source, R& result )
{
// get the maximum safe value of type R
R rMax = (R) ~0;
if ( rMax < 0 ) // R is a signed type
{
// assume that we're on an 8-bit twos-compliment machine
rMax = ~( 0x80 << ( ( sizeof( R ) - 1 ) * 8 ) );
}
if ( ( source & rMax ) != source )
{
throw new IntegerOverflowException( source );
}
result = static_cast<R>( source );
}
Это правильно и эффективно?
РЕДАКТИРОВАТЬ: По разным причинам stl не доступен, поэтому я не могу использовать std :: numeric_limits, и что-то из Boost прямо сейчас.