Modelo C ++ para conversão de números inteiros seguros

Estou tentando escrever uma função de modelo C ++ que lançará uma exceção de tempo de execução no estouro de número inteiro em transmissões entre diferentes tipos integrais, com larguras diferentes e possível incompatibilidade assinada / não assinada. Para esses fins, não estou preocupado com a conversão de tipos de ponto flutuante para tipos integrais, nem outras conversões de objeto para objeto. Eu gostaria de fazer isso sem precisar escrever muito código de caso especial. Isto é o que eu tenho atualmente:

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 );
}

Isso é correto e eficiente?

EDIT: Por várias razões, stl não está disponível, então não posso usar std :: numeric_limits, e qualquer coisa do Boost está correta.

questionAnswers(18)

yourAnswerToTheQuestion