开发者

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.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜