Tôi thấy @GMan đã triển khai a version of sizeof...
cho các mẫu có định dạng variadic (theo như tôi có thể biết) tương đương với số được xây dựng trong sizeof...
. Điều này không vi phạm nguyên tắc thiết kế thứ hai: prefer libraries to language extensions?Tại sao có một toán tử sizeof ... trong C++ 0x?
Trả lời
Từ Variadic Templates (Revision 3) (N2080=06-0150), trang 6:
Mặc dù không thực sự cần thiết (chúng tôi có thể thực hiện
count
mà không cần tính năng này), kiểm tra chiều dài của một gói tham số là một hoạt động phổ biến mà xứng đáng với cú pháp đơn giản. Hơn nữa, hoạt động này có thể trở nên cần thiết cho các lý do kiểm tra kiểu khi các mẫu variadic được kết hợp với các khái niệm; xem Phần 3.3.
(Phần 3.3 nói về khái niệm đó là không thích hợp ngay bây giờ.)
sizeof...
chỉ là đường, tôi nghĩ vậy.
sizeof
thực sự là cốt lõi để các ngôn ngữ như là ...
, và mặc dù một hàm countof
có thể tồn tại, chúng tôi đã có sizeof
và ...
reserved vì vậy chúng tôi cũng có thể làm cho nó thuận tiện để lấy số liệu như vậy.
Ngược lại, nếu sizeof
và ...
không được đặt trước, ý tưởng thêm một điều như vậy có thể đã thất bại vì từ khóa mới có xu hướng bị cau mày. (Càng ít càng tốt.)
'sizeof ... 'cũng có thể được áp dụng như nhau cho mẫu và tham số chức năng gói. Vì vậy, 'sizeof ... (T)' và 'sizeof ... (t)' hoạt động tốt như nhau. Một giải pháp dựa trên thư viện sẽ hoạt động với các gói tham số mẫu hoặc chức năng nhưng không phải với cả hai, tôi tin. Bởi vì một mở rộng tạo ra một chuỗi các kiểu, và việc mở rộng khác tạo ra một chuỗi các biểu thức. Có thể viết nó như là 'template struct count; 'và sau đó truyền gói như' count 'có thể hoạt động. Vì 'sizeof' có thể xử lý cả hai kiểu và biểu thức có vẻ hoạt động, nhưng rõ ràng là xấu hơn :) –