2010-10-14 12 views
5

J'ai récemment commencé à lire la conception moderne C++ par Andrei Alexandrescu. Après avoir lu la compilation Assertions, j'ai essayé le code suivant:CompileTimeChecker de la conception C++ moderne ne fonctionne pas comme prévu

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

Le code ne doit pas compiler en raison de la ligne 2, mais il compile bien. Si je change la ligne 1 à

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

ou

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

fonctionne comme prévu. Je ne comprends pas.

+0

Exact duplicate (même utilisateur): [CompileTimeChecker de la conception C++ moderne ne fonctionne pas comme prévu.] (Http://stackoverflow.com/questions/3934643/compiletimechecker-from-modern-c-design-not-working-as -expected) –

+0

Fermez l'autre comme doublon. Laissez celui-ci être ouvert. –

+0

@Paul R: Je pense que @Saurabh posté la même question deux fois (par erreur je pense), l'autre a déjà été fermé en tant que doublon à celui-ci et maintenant vous fermez ceci en considérant celui-ci comme la dupe de l'autre. –

Répondre

2

Essayez updated version à partir du Loki library.

+0

@Nikolai: Cela fonctionne. Dans ce code, quel est le besoin de (void) Error _ ## msg; –

+0

Cette deuxième déclaration est là, je devine, donc le compilateur ne se plaint pas de la variable inutilisée. –

+0

Ok. Et avez-vous quelque chose sur la question que j'ai posée? –