Tak. Możliwy duplikat drukuje rozmiar jako komunikat error, co oznacza, że kompilacja się nie powiedzie.
Jednak moje rozwiązanie drukuje rozmiar jako ostrzeżenie wiadomość, co oznacza, że wydrukuje rozmiar, a kompilacja będzie kontynuowana.
template<int N>
struct print_size_as_warning
{
char operator()() { return N + 256; } //deliberately causing overflow
};
int main() {
print_size_as_warning<sizeof(int)>()();
return 0;
}
komunikat ostrzegawczy:
prog.cpp: In member function ‘char print_size_as_warning<N>::operator()() [with int N = 4]’:
prog.cpp:8: instantiated from here
prog.cpp:4: warning: overflow in implicit constant conversion
Demo: http://www.ideone.com/m9eg3
Uwaga: wartość n mieści się w ostrzegawczy jest wartość sizeof (int)
Powyższy kod jest poprawiony, a mój pierwszy próba była to:
template<int N>
struct _{ operator char() { return N+ 256; } }; //always overflow
int main() {
char(_<sizeof(int)>());
return 0;
}
komunikat ostrzegawczy:
prog.cpp: In member function ‘_<N>::operator char() [with int N = 4]’:
prog.cpp:5: instantiated from here
prog.cpp:2: warning: overflow in implicit constant conversion
Demo: http://www.ideone.com/mhXjU
Pomysł pochodzi z mojej poprzedniej odpowiedzi na to pytanie:
Czy tego właśnie szukasz? http://stackoverflow.com/questions/2008398/to-it-possible-to-print-out-the-size-of-ac-class-at-compile-time – birryree
Wiele kompilatorów ma '# pragma' lub inne dyrektywa, której można używać do wyprowadzania wartości podczas kompilacji. Musisz sprawdzić dokumentację kompilatora. Niestety nie wiem, jak uzyskać kompilator do oceny wyrażenia, zanim wygeneruje wynik. –
Nie, to inne pytanie. –