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.