Статические утверждения очень удобны для проверки вещей во время компиляции. Простая идиома статического утверждения выглядит следующим образом:
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)
Как получилось?