Ho recentemente iniziato a leggere Modern C++ Design di Andrei Alexandrescu. Dopo aver letto in fase di compilazione asserzioni, ho provato il seguente codice:CompileTimeChecker da Modern C++ Design non funziona come previsto
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*/ }
Il codice non dovrebbe compilare a causa di linea 2, ma compila bene. Se cambio la Linea 1 al
(void)(CompileTimeChecker<(expr)!=0>((ERROR_##msg()))); /*Line 1*/ }
o
new CompileTimeChecker<(expr)!=0>((ERROR_##msg())); /* Line 1*/ }
funziona come previsto. Non capisco
duplicato esatto (stesso utente): [CompileTimeChecker da Design C++ moderno non funziona come previsto.] (Http://stackoverflow.com/questions/3934643/compiletimechecker-from-modern-c-design-not-working-as -atteso) –
Chiudere l'altro come duplicato. Lascia che questo sia aperto. –
@Paul R: Penso che @Saurabh abbia postato la stessa domanda due volte (per errore credo), l'altro è già stato chiuso come duplicato per questo e ora lo stai chiudendo considerando questo come il dupe dell'altro. –