8

の算術抽出演算子にstd::basic_istream、8 つの整数型すべてに対する非仮想オーバーロードがあり(とにかく処理が異なる char はリストされていません)、そのうちの 6 つに対してnum_get::get個別の仮想オーバーロードを持つ を呼び出します(short と int の符号付きバージョンがありません) 。

の算術挿入演算子には、8 つの整数型すべてに対する非仮想オーバーロードstd::basic_ostreamもあり、 を呼び出します。これには、とその符号なしバリアントである4 つの型に対する仮想オーバーロードのみがあります。小さい型の場合、挿入演算子は整数昇格を実行します。num_put::putlonglong long

ユーザーの拡張性を実現するためのツール・デ・フォースにギャップがあるのはなぜでしょうか? 整数型ごとにユーザー定義の処理を提供すること (たとえば、iostream インターフェイスの上に型を保持するシリアル化ライブラリを構築すること) を提供することは不可能に思えます。さらに、非対称です。わずかな労力で達成できた可能性があります。トレードオフはありますか?

4

2 に答える 2

4

値を読み取るときは、オーバーフローを許可する必要があるため、型ごとにエクストラクタが必要です。値を書き込んでいないときは、最大の型で十分です。昔、最大のタイプはlong. long longが追加されたとき、 のバージョンlongは下位互換性のために保持されていました。

于 2013-04-09T18:05:09.230 に答える
4

標準 C++ Iostreams および Localesによると:

一見すると、short、int、または float の put() のバージョンが欠落しているように見えるかもしれません。その意図は、標準ライブラリのインターフェースを簡潔に保つことであり、short または int 型の値は long のバージョンで処理できます。同様に、float 型の値は、double の put() バージョンで処理できます。

そして後で約num_get::get()

ここでも、num_put::put() と同様に、絶対に必要でない型は省略されています。

于 2013-04-09T18:14:08.080 に答える