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.)
- 1. Tại sao sizeof được coi là toán tử?
- 2. Toán tử C++ sizeof tính kích thước như thế nào?
- 3. tại sao chúng ta thích? đến ?? toán tử trong C#?
- 4. Có thể C++ 0x vẫn phân bổ rõ ràng với toán tử mới?
- 5. tại sao sizeof ('a') là 4 trong C?
- 6. Tại sao tôi không thể sử dụng sizeof() trong #if?
- 7. Tại sao toán tử gán bản sao quá tải cho một lớp singleton trong C++?
- 8. toán tử tăng không làm việc với sizeof
- 9. Tại sao sizeof (void) == 1?
- 10. Toán tử có động C#?
- 11. Tại sao sizeof (chuỗi) == 32?
- 12. Tại sao có hai toán tử Shift phải và chỉ có một toán tử Shift trái đơn trong Java?
- 13. Tại sao C++ vẫn có một toán tử xóa [] và xóa?
- 14. Tại sao sizeof (int) khác với sizeof (int *)?
- 15. Tại sao không có ổ khóa phạm vi cho nhiều mutexes trong C++ 0x hoặc Boost.Thread?
- 16. Tại sao một người dùng toán tử | = trên giá trị boolean trong C#?
- 17. Tại sao −1> sizeof (int)?
- 18. Tại sao `: =` làm việc như một toán tử infix?
- 19. Tại sao không có toán tử [] cho danh sách std ::?
- 20. Tại sao "xóa [] [] ... multiDimensionalArray;" toán tử trong C++ không tồn tại
- 21. C++ 0x thực hiện mẫu nguyên tử
- 22. Toán tử vs Hàm trong C/C++
- 23. điều hành sizeof() trong C
- 24. toán tử typeof trong C
- 25. C++ 0x, các chữ cái do người dùng xác định với toán tử bạn ""()
- 26. Toán tử D không có trong C++
- 27. Tại sao toán tử 'bằng' trong LINQ tham gia?
- 28. Tại sao các toán tử gán quá tải trong VB.NET?
- 29. Tại sao không có thuật toán std :: copy_if?
- 30. Toán tử C++ 0x T + (const T &, T &&), vẫn cần di chuyển?
'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 :) –