1

gcc 4.2.4 を使用しています。Schildt によると、「C++ The Complete Reference」、1995 年、ユーザー定義のパラメーター化されたマニピュレーターは次のように定義する必要があります。

istream &mymanip(istream &stream, type param)
{
    // here my code 
    return stream;
}
// overload 
imanip<type> mymanip(type param){
    return imanip<type>(mymanip, param)
}
// usage
cin >> mymanip(param);

imanip(mymanip, param) は、mymanip と mymanip の引数を含むオブジェクトを返すことになっていると思います。これは、オーバーロードされた operator>> が mymanip を呼び出すために使用する必要があります。ただし、これは機能しません。imanip が宣言されていません。

このバージョンも見つけました:

IMANIP(int) fld(int n){
    return IMANIP(int)(fld,n);
    }

これも機能しません。

私の質問は次のとおりです。

  1. gcc 4.2.4 は、この詳細について ANSI C++ 標準に従っていますか? もしそうなら、この点に関して 1995 年以降、規格は変更されましたか?
  2. 独自のパラメータ化されたマニピュレータを定義するには、iostream コードを理解し、独自のオーバーロードされた imanip および operator>> 関数を記述する必要がありますか?
  3. 質問 2 への回答に関係なく、iostream コードを理解するための最善の戦略は何ですか? コードを読む必要がありますか?iostream の一部であるコンパイル済みライブラリの名前を調べるにはどうすればよいですか? 本を読むべきですか?
4

1 に答える 1

2

あなたが投稿したコードは文脈から外れているようです。imanipテンプレートのように見えますが、そのテンプレートはコードのどこにも定義されていません。

しかし、正直なところ、1995 年の C++ に関する本を使用することはもう考えません。1995 年には、「注釈付きリファレンス マニュアル」は存在していましたが、C++ は標準化さえされていませんでした。あなたの本は 17 年以上前のものです。つまり、プログラミング言語に関して言えば、「非常に時代遅れ」という意味です。それ以来、C++ は大きく進化してきました。より最近の本を購入することを検討してください。おそらくhttp://isocpp.org/get-startedを見て、いくつかの例を示してください。

質問に対するより具体的な回答を得るには:

  1. はい、gcc はこの点で標準に従っていますが、あなたの本はそうではないかもしれません。
  2. マニピュレータは、op<< と op>> を再実装する必要がないように作成されています。ただし、マニピュレータの設計内容によっては、ストリームまたはストリームバッファによって提供される下位レベルのメソッドを呼び出す必要がある場合があります。
  3. 「コード」は存在せず、標準ライブラリの実装者がいくつかあり、それらはすべて独自の、時には非常に複雑なコードなどを持っています。これらのライブラリがどのように機能するかについての情報を Web で検索することをお勧めします。もちろん、本はさらに良いです。N. Josuttis による「The C++ Standard Library」の購入を検討してください。「現在および将来」の標準ライブラリをカバーする最新版があります。つまり、C++11 標準の追加が含まれています。
于 2012-11-26T12:06:01.453 に答える