2011-06-08 13 views
5

tengo 4 constantes int:¿Cómo comprobar estáticamente que dos razones son iguales?

const int a1 = 1024; 
const int a2 = 768; 
const int b1 = 640; 
const int b2 = 480; 

y yo quiero comprobar estáticamente que tienen la misma relación. Para comprobar estáticamente, estoy usando BOOST_STATIC_ASSERT, pero no admite expresiones.

yo probamos este:

BOOST_STATIC_ASSERT(1e-5 > std::abs((double)a1/(double)a2 - (double)b1/(double)b2)); 

pero esto produce errores de compilación siguiente:

error: floating-point literal cannot appear in a constant-expression 
error: 'std::abs' cannot appear in a constant-expression 
error: a cast to a type other than an integral or enumeration type cannot appear in a constant-expression 
error: a cast to a type other than an integral or enumeration type cannot appear in a constant-expression 
error: a cast to a type other than an integral or enumeration type cannot appear in a constant-expression 
error: a cast to a type other than an integral or enumeration type cannot appear in a constant-expression 
error: a function call cannot appear in a constant-expression 
error: template argument 1 is invalid 

Cómo corregir la línea anterior con el fin de hacer pasar la compilación?

PD No tengo acceso a las características de C++ 0x y std :: static_assert, es por eso que estoy usando el assert estático de boost.

Respuesta

9
BOOST_STATIC_ASSERT(a1 * b2 == a2 * b1); 
+0

+1: Esto es matemáticamente mejor. Pero la pregunta es, cómo resolver su error de compilación. –

+3

@Martijn Creo que arriba es la única manera. Ver la respuesta de Konrad –

8

¿Cómo arreglar la línea anterior para hacer que la compilación pase?

Sin tener que recurrir a la reescritura elegante de la ecuación del usuario763305, no se puede. El compilador tiene razón: "literal de punto flotante no puede aparecer en una expresión constante". Además, tampoco puede llamar a funciones (std::abs) en expresiones constantes.

C++ 0x lo resolverá usando constexpr.

Cuestiones relacionadas