2.1 编译期断言
有时候,我们的断言其实在编译时就可以判断真假,于是有编译时断言。例如如此实现:
1 #define STATIC_CHECK(expr) {char unnamed[(expr)?1:0];}
如果条件为假,编译器因大小为0的数组非法而报错。但出错信息显然没有实际意义,可以改进,使用模板:
1 template<bool> struct CompileTimeError;
2 template<> strcut CompileTimeError<true>{};
3 #define STATIC_CHECK(expr) (CompileTimeError<(expr)!=0>())
如果你试着具现化CompileTimeError<false>,编译器会提示“Undefined specialization CompileTimeError<false>”。
(进一步改进从略)