2010-10-14 10 views
5

Yakın zamanda Andrei Alexandrescu'nun Modern C++ Tasarımını okumaya başladım. Derleme Zamanlı iddialar okuduktan sonra aşağıdaki kodu çalıştı:Modern C++'dan CompileTimeChecker Beklenildiği gibi çalışmıyor Tasarım

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

kod Hat 2'ye nedeniyle derlemek olmamalı, ama iyi derler. Ben

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

veya

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

için, Hat 1 değiştirirseniz beklenen işleri olarak. Anlamadım.

+0

Tam çift (aynı kullanıcı): [CompileTimeChecker, Modern C++ Tasarımından beklendiği gibi çalışmıyor.] (Http://stackoverflow.com/questions/3934643/compiletimechecker-from-modern-c-design-not-working-as Beklenen) –

+0

Diğerini, kopya olarak kapatın. Bunun açık olmasına izin ver. –

+0

@Paul R: Sanırım @Saurabh aynı soruyu iki kere (sanırım yanlışlıkla) paylaştı, diğeri de bu yazının bir kopyası olarak kapatıldı ve şimdi bunu bir diğerinin duplisi olarak görüyorsunuz. –

cevap

2

Loki library'dan updated version'u deneyin.

+0

@Nikolai: Bu işe yarıyor. Bu kodda, (void) Error _ ## msg; –

+0

Bu ikinci ifade var, tahmin ediyorum, bu yüzden derleyici kullanılmayan değişken hakkında şikayet etmez. –

+0

Tamam. Ve aslında sorduğum soru hakkında bir şey var mı? –

İlgili konular