CompileTimeChecker from Modern C++ Design not working as expected
I've recently started reading Modern C++ Design by Andrei Alexandrescu. After reading Compile-Time Assertions, I tried the following code:
template<bool> struct CompileTimeChecker
{
CompileTimeChecker(...){};
};
template<> struct CompileTimeChecker<false>{};
#define STATIC_CHECK(expr, msg) \
{\
class ERROR_##msg{}; \
(void)sizeof(CompileTimeChecker<(expr)!=0>((ERROR_##msg()))); /*Line 1*/ }
int main()
{
STATIC_CHECK(sizeof(char)>sizeof(int),TypeTooNarrow); /*Line 2*/
STATIC_CHECK(sizeof(char)<sizeof(int),TypeTooNarrow); /*Line 3*/
}
The code should not compile due to Line 2, but it compiles fine. If I change the Line 1 to
(void)(CompileTimeChecker<(expr)!=0>((ERROR_##msg()))); /*Line 1*/ }
or
new CompileTimeChecker<(expr)!=0>((ERROR_##msg())); /* Line 1*/ }
it works as expected. 开发者_如何学运维I don't get it.
Try updated version from the Loki library.
Since C++11 it's preferable to use static_assert rather than this technique. A lot of what is described in Modern C++ Design has now been replaced by standard language or library features. It's (probably) still worth reading though.
加载中,请稍侯......
精彩评论