2013-04-09 13 views
8

std::basic_istream算術提取操作員non-virtual overloads for all 8 integer types(未上市字符,這是不同無論如何處理),並呼籲num_get::get,其中有個別virtual overloads for 6 of them爲什麼num_get和num_put是不對稱的?

算術插入運營商std::basic_ostream(失蹤簽署的短期和INT的版本)它也有non-virtual overloads for all 8 integer types,它調用num_put::put,它只有virtual overloads for 4 types,它們是long,long long及其未簽名的變體。對於較小的類型,插入操作符執行整數升級。

爲什麼在用戶可擴展性方面存在差距?似乎不可能爲每種整數類型提供用戶定義的處理(例如,在iostream接口之上構建一個保存類型的序列化庫),而且它是不對稱的。它可以很輕鬆地完成。是否有權衡?

回答

4

根據Standard C++ Iostreams and Locales

乍一看它可能看起來好像放()的簡稱,詮釋的版本, 或浮動丟失。其目的是保持標準庫的接口簡潔,並且可以通過long版本處理short或int類型的值爲 。類似的,double類型的put()版本可以處理float類型的值 。

再後來就約num_get::get()

同樣,與num_put :: put()方法,被省略的不是絕對必要 類型。

+0

但問題的意圖是要問爲什麼模塊化決定反對 - 例如,自定義的num_put和num_get,允許使用格式化的輸入/輸出操作符的二進制I/O。 – 2013-09-30 02:44:45

+0

@ LB--:我相信這兩個答案都有充分的解釋。你錯過了什麼? – 2013-09-30 03:18:15

+0

當我想要在'num_put'中保存類型信息時(例如二進制輸出),我看不出該原理是如何應用的。 – 2013-10-01 20:28:40

4

當你讀取值時,你必須允許溢出,所以每種類型都需要一個提取器。當你寫價值時你沒有,所以最大的類型就足夠了。在過去的日子裏,最大的類型是long。當添加long long時,爲保持向後兼容性而保留long的版本。

相關問題