静态断言对于在编译时检查事物非常方便。一个简单的静态断言惯用法看起来像这样:
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 )
...您会收到很多更好的错误消息...