Gli asserti statici sono molto utili per controllare le cose in fase di compilazione. Un semplice assert linguaggio statico simile a questa:asser statico per variabili const?
template<bool> struct StaticAssert;
template<> struct StaticAssert<true> {};
#define STATIC_ASSERT(condition) do { StaticAssert<(condition)>(); } while(0)
Questo è un bene per cose come
STATIC_ASSERT(sizeof(float) == 4)
e:
#define THIS_LIMIT (1000)
...
STATIC_ASSERT(THIS_LIMIT > OTHER_LIMIT);
Ma usando #define
non è il modo "C++" di definire costanti. C++ avrebbe si utilizza un namespace anonimo:
namespace {
const int THIS_LIMIT = 1000;
}
o anche:
static const int THIS_LIMIT = 1000;
Il problema di questo è che con un const int
non è possibile utilizzare STATIC_ASSERT()
e si deve ricorrere a un run-time controlla quale è stupido.
C'è un modo per risolvere correttamente questo in C++ corrente?
Credo di aver letto C++ 0x ha qualche possibilità di fare questo ...
EDIT
Ok quindi questo
static const int THIS_LIMIT = 1000;
...
STATIC_ASSERT(THIS_LIMIT > 0);
compila bene
Ma this:
static const float THIS_LIMIT = 1000.0f;
...
STATIC_ASSERT(THIS_LIMIT > 0.0f);
no.
(in Visual Studio 2008)
Come mai?
Perché stai utilizzando l'asserzione statica NIH, invece di BOOST_STATIC_ASSERT? http://www.boost.org/doc/libs/1_43_0/doc/html/boost_staticassert.html –
Non riesco a usare boost (ancora) per qualche ragione aziendale stupida – shoosh
Cosa ti fa pensare che non puoi usare costanti integrali in questo caso? Quanto sopra dovrebbe funzionare bene. –