静态断言对于在编译时检查事物非常方便。一个简单的静态断言惯用法看起来像这样:

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 :
namespace {
    const int THIS_LIMIT = 1000;
}

甚至:
static const int THIS_LIMIT = 1000;

这样做的麻烦在于,使用const int不能使用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中)

怎么来的?

最佳答案

为什么,您仍然可以使用const int进行静态断言:

#define static_assert(e) extern char (*ct_assert(void)) [sizeof(char[1 - 2*!(e)])]
static_assert( THIS_LIMIT > OTHER_LIMIT )

另外,use boost!
BOOST_STATIC_ASSERT( THIS_LIMIT > OTHER_LIMIT )

...您会收到很多更好的错误消息...

10-04 13:24