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>”。
(進一步改進從略)