以前看过很长时间的boost,记得上面有STATIC_ASSERT
在loki库中也有类似的宏
1 LOKI_STATIC_CHECK(expr, msg)
其中expr代表要断言的表达式
当其为假,则让程序无法通过编译
其实现很简单
利用模板特化:
1 template<int> struct CompileTimeError;
2 template<> struct CompileTimeError<true> {};
当表达式为真则使用模板特化形式
注意其模板在这里仅仅做前向引用
再看具体的宏:
1 #define LOKI_STATIC_CHECK(expr, msg) \
2 { Loki::CompileTimeError<((expr) != 0)> ERROR_##msg; (void)ERROR_##msg; }
使用代码块(statement block)
声明一个编译时错误对象
(具体原因在于当条件为假则模板对象没有具体实现,抛出一个未定义完全的对象)
9 D:\Dev-Cpp\prj\test\main.cpp aggregate `Loki::CompileTimeError<0> ERROR_wo' has incomplete type and cannot be defined
对于其宏的实现在我看来
(void)ERROR_##msg;这句是多余的(不知道这句的作用是什么??谁能告诉我)