Las afirmaciones estáticas son muy prácticas para verificar cosas en tiempo de compilación. Un simple modismo afirman estática se ve así:static assert for const variables?
template<bool> struct StaticAssert;
template<> struct StaticAssert<true> {};
#define STATIC_ASSERT(condition) do { StaticAssert<(condition)>(); } while(0)
Esto es bueno para cosas como
STATIC_ASSERT(sizeof(float) == 4)
y:
#define THIS_LIMIT (1000)
...
STATIC_ASSERT(THIS_LIMIT > OTHER_LIMIT);
Pero el uso de #define
no es el camino "C++" de definir constantes. C++ tendría que utiliza un espacio de nombres en el anonimato:
namespace {
const int THIS_LIMIT = 1000;
}
o incluso:
static const int THIS_LIMIT = 1000;
El problema con esto es que con un const int
no se puede utilizar STATIC_ASSERT()
y hay que recurrir a un tiempo de ejecución comprobar qué es tonto.
¿Hay alguna manera de resolver esto correctamente en C++ actual?
Creo que he leído C++ 0x tiene cierta facilidad para hacer esto ...
EDITAR
Ok por lo que este
static const int THIS_LIMIT = 1000;
...
STATIC_ASSERT(THIS_LIMIT > 0);
compila bien
Pero esto:
static const float THIS_LIMIT = 1000.0f;
...
STATIC_ASSERT(THIS_LIMIT > 0.0f);
no.
(en Visual Studio 2008)
¿Cómo?
¿Por qué está utilizando NIH static assert, en lugar de BOOST_STATIC_ASSERT? http://www.boost.org/doc/libs/1_43_0/doc/html/boost_staticassert.html –
No puedo usar boost (aún) por alguna tonta razón corporativa – shoosh
¿Qué le hace pensar que no puede usar constantes integrales en este caso? Lo anterior debería funcionar bien. –