2010-10-14 14 views
5

Gần đây tôi đã bắt đầu đọc Thiết kế C++ Hiện đại của Andrei Alexandrescu. Sau khi đọc các xác nhận về thời gian biên dịch, tôi đã thử mã sau:CompileTimeChecker từ Thiết kế Hiện đại C++ không hoạt động như mong đợi

 
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*/ 
} 

Mã không được biên dịch do Dòng 2, nhưng nó biên dịch tốt. Nếu tôi thay đổi Line 1 tới

 
(void)(CompileTimeChecker<(expr)!=0>((ERROR_##msg()))); /*Line 1*/ } 

hoặc

 
new CompileTimeChecker<(expr)!=0>((ERROR_##msg())); /* Line 1*/ } 

nó hoạt động như mong đợi. Tôi không hiểu.

+0

Bản sao chính xác (cùng một người dùng): [CompileTimeChecker từ Thiết kế C++ Hiện đại không hoạt động như mong đợi.] (Http://stackoverflow.com/questions/3934643/compiletimechecker-from-modern-c-design-not-working-as bất ngờ) –

+0

Đóng một tài khoản khác là trùng lặp. Hãy để cái này mở ra. –

+0

@Paul R: Tôi nghĩ @Saurabh đã đăng cùng một câu hỏi hai lần (do nhầm lẫn mà tôi nghĩ), một câu hỏi khác đã bị đóng như trùng lặp với điều này và bây giờ bạn đang đóng này xem xét việc này là bản dupe của người khác. –

Trả lời

2

Hãy thử updated version từ số Loki library.

+0

@Nikolai: Điều đó có hiệu quả. Trong mã đó, cần có gì (void) Lỗi _ ## msg; –

+0

Đó là tuyên bố thứ hai là có, tôi đoán, do đó, trình biên dịch không phàn nàn về biến không sử dụng. –

+0

Ok. Và bạn có bất cứ điều gì về câu hỏi tôi thực sự hỏi? –

Các vấn đề liên quan