21

私はたくさんのoperator<<(std::ostream &, const T &)関数を書いてきました - それらは信じられないほど便利です。

私はoperator>>(std::istream &, T &)実際のコードで関数を書いたことはありませんし、組み込み型に抽出演算子を使用したことさえありません (OK、おそらくstd::string)。これらは、短いサンプル プログラムや教科書にのみ適していますか? operator>>C++ の失敗した機能ですか?

ストリーム演算子の安全なオーバーロードについて質問がありました。私が疑問に思うのは、誰かが実際にこれを行っているかどうかです。

C++ でファイルから入力を読み取るような単純な場合でも、を使用することはお勧めできませんoperator>>。入力のエラーを検出して処理する堅牢なコードを作成するのは非常に困難です (または方法がわかりません)。

同意しない場合は、使用の良い例を示してくださいoperator>>。おそらく、私がリンクした最後の質問に答えてください。


まとめ:皆さん、たくさんの良い意見をありがとうございます。マヌエルの答えは、私が使いたがらないことを再考させたop>>ので、それを受け入れました。

4

7 に答える 7

8

std::copyストリーム抽出演算子は、std::istream_iteratorクラスなどのSTL アルゴリズムと組み合わせると非常に役立つと思います。

この回答を読んで、私が話していることを確認してください。

于 2010-02-22T19:05:00.440 に答える
6

はい、私は演算子>>を使用します(ただし、演​​算子<<ほど頻繁ではありません)。これは、ユーザー定義の型をそれぞれのオブジェクトに解析し、解析と必要なエラー処理を一元化するのに非常に役立ちます。また、列挙型の文字列表現を解析する場合にも非常に役立ちます。

たとえば、果物を表す列挙型について考えてみます。演算子>>を使用して、文字列( "apple"、 "banana"など)を解析し、正しい列挙値を取得できます。

std::istream &operator>>(std::istream &is, Fruit &fruit)
{
    std::string str;
    is >> str;
    if (str == "apple")
        fruit = APPLE;
    else if (str == "banana")
        fruit = BANANA;
    // other fruits
    else
        is.setstate(std::ios::failbit);
    return is;
}

不明な文字列が検出されたときにストリームの障害状態を設定するためにistreamでsetstateメソッドを使用することにも注意してください。この演算子を使用すると、次のようにストリームの失敗状態を確認できます。

Fruit fruit;
std::cin >> fruit;
if (std::cin.fail())
   std::cout << "Error: Unknown Fruit!" << std::endl;
于 2010-02-22T08:59:39.633 に答える
3

値は読み取りよりも印刷されることが多いため、。operator<<よりも頻繁に使用されますoperator>>。それでも、値を読み取りたい場合operator>>は便利です。

エラーをチェックする必要があることは、に固有のものではありませんoperator>>。明らかに、値を読み取る他の方法でも、何らかの方法で無効な入力を検出する必要があります。

于 2010-02-22T08:28:03.923 に答える
2

私はそれらを書くことはなく、「組み込み」のものを使用することはめったにありません。抽出演算子は、インタラクティブなユーザー入力を読み取るのにはあまり役に立ちません。ストリームが劣化しやすいためです。カスタム構文解析ルーチンを作成することは、ほとんどの場合、より簡単で堅牢です。シリアル化に関しては、何かをテキストとして保存したい場合は、XML などの業界標準の形式で保存しますが、抽出演算子は特に読み取りに適していません。それ以外の場合は、データをデータベースまたはバイナリ ファイルに保存しますが、これもエクストラクタでの使用には適していません。

于 2010-02-22T09:41:59.903 に答える
2

operator>>テキスト形式の数値を内部表現に変換するのに役立ちます。

また、オブジェクトのデータをロードする際にも役立ちます。異なる型に対してオーバーロードできないとは異なりscanf、オブジェクトは をオーバーロードできますoperator>>。したがって、オブジェクトをロードするためにより多くのデータ隠蔽を提供し、データをオブジェクトに読み込むために内部表現を知る必要はありません。

于 2010-02-22T19:00:43.400 に答える
1

演算子>>は基本的に逆シリアル化です。私の限られた逸話的な経験では、C ++でのほとんどのシリアル化/逆シリアル化は、ストリームライブラリよりも低いレベルで実装されています。下位レベルで実装する必要はありません。通常は実装されています。

カスタム逆シリアル化の実装は必ずしも些細な問題ではありませんが、ストリーム抽出構文を使用して実装しなくても、同じ問題が発生する可能性があります。

これは、少なくともわずかに役立つストリーム抽出演算子の安っぽい使用法です:http: //www.parashift.com/c++-faq-lite/misc-technical-issues.html#faq-39.2

この限られた範囲では、正しい使用法はかなり簡単なようです。

于 2010-02-22T08:47:53.103 に答える
0

OOFILEデータベースAPIで、演算子<<を多用して、並べ替え命令のリスト、フィールドをデータベースビューなどにアセンブルしました。

何らかの理由で、多くのユーザーは、演算子>>を使用して、逆ソートであるソートフィールドを追加するのが直感的であると感じました。そもそも誰が提案したのかはわかりませんが、APIで成功したほど多くの人にアピールしました。

例えば:

dbSorter arcSort;  // declare a sorter
arcSort << reverse(Date) << FileName; // "normal" way to specify two sort fields
arcSort >> Date << FileName;  // shorthand way that evolved to specify 

また、従来の演算子>>を使用して、ストリームからdbTable全体を解析しました。

于 2010-02-22T08:29:51.970 に答える