开发者

CompileTimeChecker from Modern C++ Design not working as expected

开发者 https://www.devze.com 2023-01-19 20:30 出处:网络
I\'ve recently started reading Modern C++ Design by Andrei Alexandrescu. After reading Compile-Time Assertions, I tried the following code:

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

精彩评论

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