ストラウストラップのプログラミング入門(19) 第11章とドリル
『ストラウストラップのプログラミング入門』を読む。今日は11章「入力と出力のカスタマイズ」まで。10章と11章はセットのような感じです。
11章のコードが動かん! と思ったら動いてた…
11章のコードを写経して実行したら、意図どおりに動かず、ハマりました。というか、じつは問題なく動いていたのですが、動いていないと誤解していました。
11章では、10章に引き続き、ユーザ定義の入力ストリームを作ります。このとき、>>演算子の結果を評価する関数(bool値を返す)もまた、独自に定義します。
このbool関数は、改行の読み込みではストリームの状態を非goodにしません。つまり、この関数で改行を評価すると、falseが返らず、読み込みが終わらない状態に見えます。
Windowsの場合、Ctrl-zとEnterを入力すれば、入力の受け取りを終えて、次の処理に進みます。…ということに気づきませんでした。愚か過ぎた。
素朴な疑問
ちなみに、そのbool関数というのは、これなのですが(p.351)・・・ # sourceはPunct_streamのメンバでistream&
Punct_stream::operator bool() { return !(source.fail() || source.bad()) && source.good(); }
これって、return !(source.fail()); ではダメなのでしょうか? なぜここまでストリームの状態を慎重にチェックするのか、不思議です。
余談(istream)
ところで、ユーザ定義のストリームのためにbool関数を定義するということは、本来の>>の結果に対しても、bool値を返す関数が存在するということでしょうか。
そう思って、istreamファイルのbasic_istreamクラスを見てみたところ、何が何だかまったく分かりませんでした。
「MyT」というのは、C++では、もしやclazzやMyClassみたいな何かに該当するのかなぁ…全然別物なんだろうか…。