boost静态断言的原理是利用了编译器对不完整类型进行sizeof操作时会产生编译错误这种方式进行的编译器检查。
声明一个模板类型,仅仅是声明,未定义:
template <bool x> struct STATIC_ASSERT_FAILURE;
进行模板特化:
template<> struct STATIC_ASSERT_FAILURE<true> { enum {value = 1 }; };
这是一个完整的类型,可以实例化对象,可以进行sizeof操作。
定义一个测试类,作用是使用typedef来声明一个类型,在编译期间会对类型进行检查,并且链接后不会产生额外的汇编代码。
template<size_t x> struct StaticAssertTest {};
具体的宏定义如下:
#define STATIC_ASSERT(x) \
typedef StaticAssertTest< \
sizeof(STATIC_ASSERT_FAILURE<bool(x)>)> \
StaticAssertTypedef##__LINE__