Шаблон 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 прямо сейчас.

Ответы на вопрос(9)

Ваш ответ на вопрос