2013-04-09 35 views
8

Nhà điều hành khai thác số học cho std::basic_istreamnon-virtual overloads for all 8 integer types (không niêm yết chars, được xử lý khác nhau anyway), và nó gọi num_get::get, trong đó có cá nhân virtual overloads for 6 of them (thiếu phiên bản có chữ ký của ngắn và int)Tại sao num_get và num_put không đối xứng?

Toán tử chèn số học cho std::basic_ostream cũng có non-virtual overloads for all 8 integer types và gọi là num_put::put, chỉ có virtual overloads for 4 types, là long, long long và các biến thể chưa được ký của chúng. Đối với các loại nhỏ hơn, toán tử chèn thực hiện các chương trình khuyến mãi số nguyên.

Tại sao lại có một khoảng trống trong một hành trình mở rộng khả năng mở rộng của người dùng? Có vẻ như không thể cung cấp xử lý do người dùng xác định cho từng loại số nguyên (ví dụ: để xây dựng thư viện tuần tự lưu trữ kiểu trên đầu giao diện iostream) và moreso, nó không đối xứng. Nó có thể đạt được với ít nỗ lực. Có thương mại không?

Trả lời

4

Theo Standard C++ Iostreams and Locales:

Thoạt nhìn nó có thể trông như phiên bản đặt() cho short, int, float hoặc bị thiếu. Mục đích là giữ giao diện của thư viện chuẩn ngắn gọn và giá trị loại ngắn hoặc int có thể là được xử lý bởi phiên bản dài. Tương tự, giá trị của kiểu float có thể được xử lý bởi phiên bản put() của double.

và sau đó vào khoảng num_get::get():

Một lần nữa, như với num_put :: put(), các loại mà không phải là hoàn toàn cần thiết bị bỏ qua.

+0

Nhưng mục đích của câu hỏi là hỏi tại sao mô-đun được quyết định chống lại - ví dụ: tùy chỉnh num_put và num_get cho phép nhị phân I/O với các toán tử đầu vào/đầu ra được định dạng. –

+0

@ LB--: Tôi tin rằng điều đó được giải thích đầy đủ trong cả hai câu trả lời. Bạn đã bỏ lỡ điều gì? –

+0

Tôi không thấy lý do áp dụng như thế nào khi muốn giữ lại thông tin loại trong 'num_put', chẳng hạn như cho đầu ra nhị phân. –

4

Khi bạn đang đọc các giá trị bạn phải cho phép tràn, vì vậy cần một bộ giải nén cho từng loại. Khi bạn đang viết giá trị bạn không, vì vậy loại lớn nhất là đủ. Quay trở lại những ngày xưa, loại lớn nhất là long. Khi long long được thêm vào, phiên bản cho long được giữ để tương thích ngược.