Có. Các bản sao có thể in kích thước như lỗi tin nhắn, có nghĩa là việc biên dịch sẽ không thành công.
Tuy nhiên, giải pháp của tôi in kích thước là cảnh báo tin nhắn, có nghĩa là, nó sẽ in kích thước và quá trình biên dịch sẽ tiếp tục.
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;
}
nhắn Warning:
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
Lưu ý: giá trị của N trong thông điệp cảnh báo là giá trị của sizeof (int)
Mã trên được cải thiện một và lần đầu tiên của tôi nỗ lực là thế này:
template<int N>
struct _{ operator char() { return N+ 256; } }; //always overflow
int main() {
char(_<sizeof(int)>());
return 0;
}
nhắn Cảnh báo:
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
Ý tưởng được lấy từ câu trả lời trước của tôi cho câu hỏi này:
Đây có phải là những gì bạn đang tìm kiếm không? http://stackoverflow.com/questions/2008398/is-it-possible-to-print-out-the-size-of-ac-class-at-compile-time – birryree
Nhiều trình biên dịch có '# pragma' hoặc các trình biên dịch khác chỉ thị có thể được sử dụng để xuất các giá trị trong quá trình biên dịch. Bạn sẽ phải kiểm tra tài liệu của trình biên dịch. Thật không may tôi không biết làm thế nào để có được trình biên dịch để đánh giá biểu thức trước khi nó tạo ra đầu ra. –
Không, đó là câu hỏi khác. –