静态断言对于在编译时进行检查非常方便。一个简单的静态断言习惯用法如下所示:
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);
但是 using#define
不是定义常量的“C++”方式。C++ 会让你使用匿名命名空间:
namespace {
const int THIS_LIMIT = 1000;
}
甚至:
static const int THIS_LIMIT = 1000;
这样做的问题是,const int
你不能使用a STATIC_ASSERT()
,你必须求助于运行时检查,这很愚蠢。
有没有办法在当前的 C++ 中正确解决这个问题?
我想我读过 C++0x 有一些工具可以做到这一点......
编辑
好的,所以这个
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 中)
怎么会?