ストラウストラップのプログラミング入門(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()); ではダメなのでしょうか? なぜここまでストリームの状態を慎重にチェックするのか、不思議です。

ドリル

ドリルは、try thisの問題とほぼ同じ内容で、ちょっと拍子抜けでしたが、一応やりました。

余談(istream)

ところで、ユーザ定義のストリームのためにbool関数を定義するということは、本来の>>の結果に対しても、bool値を返す関数が存在するということでしょうか。

そう思って、istreamファイルのbasic_istreamクラスを見てみたところ、何が何だかまったく分かりませんでした。

「MyT」というのは、C++では、もしやclazzやMyClassみたいな何かに該当するのかなぁ…全然別物なんだろうか…。