Статические утверждения очень удобны для проверки во время компиляции. Простая статическая утверждают идиома выглядит следующим образом:static assert для константных переменных?
template<bool> struct StaticAssert;
template<> struct StaticAssert<true> {};
#define STATIC_ASSERT(condition) do { StaticAssert<(condition)>(); } while(0)
Это хорошо для вещей, как
STATIC_ASSERT(sizeof(float) == 4)
и:
#define THIS_LIMIT (1000)
...
STATIC_ASSERT(THIS_LIMIT > OTHER_LIMIT);
Но использование #define
не "C++" способ определения константы. C++ бы использовать анонимное пространство имен:
namespace {
const int THIS_LIMIT = 1000;
}
или даже:
static const int THIS_LIMIT = 1000;
Проблема в том, что с const int
вы не можете использовать STATIC_ASSERT()
и вы должны прибегнуть к времени выполнения проверьте, что глупо.
Есть ли способ правильно решить эту проблему в текущем C++?
Я думаю, что я читал C++ 0x имеет некоторое средство, чтобы сделать это ...
EDIT
ИТАК это
static const int THIS_LIMIT = 1000;
...
STATIC_ASSERT(THIS_LIMIT > 0);
отлично компилируется
Но это:
static const float THIS_LIMIT = 1000.0f;
...
STATIC_ASSERT(THIS_LIMIT > 0.0f);
нет.
(в Visual Studio 2008)
Почему?
Почему вы используете статическое утверждение NIH вместо BOOST_STATIC_ASSERT? http://www.boost.org/doc/libs/1_43_0/doc/html/boost_staticassert.html –
Я не могу использовать boost (пока) по какой-то глупой корпоративной причине – shoosh
Что заставляет вас думать, что вы не можете использовать интегральные константы в этом случае? Вышеизложенное должно работать нормально. –