5

STLの美しさを見た人は、可能な限りSTLを使用しようとします。また、生のポインター配列を使用して、STLを見るところならどこでも使用するように勧めます。Scott Meyersは、STLに関する本全体をEffectiveSTLというタイトルで書いています。ifstreamしかし、彼らが好んchar*だ開発者に何が起こったのかstd::string。の最初のパラメータが。ではなくifstream::open()タイプであるのはなぜだろうか。その署名を見てください:const char*const std::string &

void open(const char * filename, ios_base::openmode mode = ios_base::in );

なぜこれ?なぜこれではないのですか?

void open(const string & filename, ios_base::openmode mode = ios_base::in );

これはデザインの重大な間違いですか?それとも、このデザインは意図的なものですか?理由は何でしょうか?char*彼らがよりも好んだ理由はわかりませんstd::stringchar*をとる後者の関数に渡すことができることに注意してくださいstd::string。問題ない!

ちなみに、これifstreamはtypedefであることを認識しているので、私のタイトルについてのコメントはありません。短く見えるので使ってみました。

実際のクラステンプレートは次のとおりです。

template<class _Elem,class _Traits> class basic_ifstream;
4

3 に答える 3

7

IOStream は、STL の一部が標準ライブラリに統合される前に設計されたためです。そして、その後文字列クラスが作られました。標準化プロセスがかなり遅れており、IOStream の変更は保存とは見なされませんでした。

ところで、C++0X のマイナーだが便利な変更の一部として、この種のクリーンアップがありました。

于 2011-01-09T16:45:52.203 に答える
4

標準の私のコピーはあなたに同意しません。これらは両方ともオーバーロードであると言います:

void open(const char* s, ios_base::openmode mode = ios_base::in);
void open(const string& s, ios_base::openmode mode = ios_base::in);

ただし、その標準のコピーは、標準の次のバージョンである C++0x のドラフトです。

この理由は、iostreamsライブラリが よりも前std::basic_stringのものであり、ライブラリの設計者が誰かに持たせ#include <string>たくなかったためです。

于 2011-01-09T16:46:48.363 に答える
0

通常、a から C 文字列を取得するのは、C 文字列から astd::stringを構築するよりもコストがかからないため、両方から取得したファイル名std::stringを使用する可能性が高いことを考えると、インターフェイスで a を使用しても大きなコストはかかりません。 .std::ifstreamconst char*

これは設計上の重大な間違いですか?

現在のインターフェースでできないことは何ですか? const std::string&インターフェースを利用することで得られる具体的かつ重要な利点は何ですか?

私が見ているように、オーバーロードの本当の利点は、std::string初心者が最初に std::string とストリームを一緒に使用しようとするときに物事を簡単に正しく行うのに役立つことです。経験豊富な C++ 開発者にとって、.c_str()必要なときに作成するわずかなコストは、コードの開発に費やされる残りの労力と比較して無視できる可能性があります。

于 2011-01-09T17:03:42.133 に答える