Naw*_*waz 5 c++ stl class-design std standard-library
我们这些看过STL之美的人试图尽可能地使用它,并且还鼓励其他人在使用原始指针和数组的任何地方使用它.斯科特迈耶斯写了一本关于STL的全书,题目为有效STL.然而,发生了什么事的开发商ifstream,他们首选char*了std::string.我想知道为什么第一个参数ifstream::open()是类型const char*,而不是const std::string &.请看一下它的签名:
void open(const char * filename, ios_base::openmode mode = ios_base::in );
Run Code Online (Sandbox Code Playgroud)
为什么这个?为什么不这样:
void open(const string & filename, ios_base::openmode mode = ios_base::in );
Run Code Online (Sandbox Code Playgroud)
这是设计的一个严重错误吗?或者这个设计是故意的?可能是什么原因?我不明白为什么他们宁愿任何理由char*了std::string.注意我们仍然可以传递char*给后面的函数std::string.那不是问题!
顺便说一句,我知道这ifstream是一个typedef,所以没有评论我的头衔.:P.它看起来很短,这就是我使用它的原因.
实际的类模板是:
template<class _Elem,class _Traits> class basic_ifstream;
Run Code Online (Sandbox Code Playgroud)
因为IOStream是在部分STL集成到标准库之前设计的.然后是字符串类.在标准化过程中已经很晚了,修改IOStream并不算是保存.
BTW,作为C++ 0X中次要但方便的变化的一部分,有一种清理这种事情.
我的标准副本不同意你的观点。它说这两个都是重载:
void open(const char* s, ios_base::openmode mode = ios_base::in);
void open(const string& s, ios_base::openmode mode = ios_base::in);
Run Code Online (Sandbox Code Playgroud)
然而,该标准的副本是该标准下一版本 C++0x 的草案。
其原因是该iostreams库早于std::basic_string,并且因为库设计者不希望有人必须使用#include <string>它以及所有其他相关的包袱(如果他们不想使用它)。