C ++ Plantilla para conversiones enteras seguras

Estoy tratando de escribir una función de plantilla de C ++ que arroje una excepción de tiempo de ejecución en el desbordamiento de enteros en conversiones entre diferentes tipos integrales, con diferentes anchos y posibles desajustes con signo / sin signo. Para estos propósitos, no me preocupa la conversión de tipos de punto flotante a tipos integrales, ni otras conversiones de objeto a objeto. Me gustaría hacer esto sin tener que escribir muchos códigos de casos especiales. Esto es lo que tengo actualmente:

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

Es esto correcto y eficient

EDIT: Por varias razones, stl no está disponible, por lo que no puedo usar std :: numeric_limits, y cualquier cosa de Boost está disponible.

Respuestas a la pregunta(18)

Su respuesta a la pregunta