c++ - geeksforgeeks - Diseño de la clase std:: ifstream
stl c++ (3)
Aquellos de nosotros que hemos visto la belleza de STL tratamos de usarlo tanto como sea posible, y también alentamos a otros a usarlo donde sea que los veamos utilizando punteros y matrices en bruto . Scott Meyers ha escrito un libro completo sobre STL, con el título Effective STL . Sin embargo, lo que sucedió con los desarrolladores de ifstream
que prefirieron char*
over std::string
. Me pregunto por qué el primer parámetro de ifstream::open()
es de tipo const char*
, en lugar de const std::string &
. Por favor, eche un vistazo a su firma:
void open(const char * filename, ios_base::openmode mode = ios_base::in );
¿Por qué esto? ¿Por qué no esto?
void open(const string & filename, ios_base::openmode mode = ios_base::in );
¿Es este un grave error con el diseño? O este diseño es deliberado? ¿Cuál podría ser la razón? No veo ninguna razón por la que hayan preferido char*
over std::string
. Tenga en cuenta que aún podemos pasar char*
a la última función que toma std::string
. ¡Eso no es un problema!
Por cierto, soy consciente de que ifstream
es un typedef, así que no hay comentarios sobre mi título. Parece corto por eso lo usé.
La plantilla de clase real es:
template<class _Elem,class _Traits> class basic_ifstream;
Por lo general, no es más costoso obtener una cadena C de std::string
que construir una std::string
desde una cadena C, por lo que es probable que desee usar std::ifstream
con nombres de archivo que provienen de ambos, usar un const char*
en la interfaz no es un costo significativo.
¿Es este un grave error con el diseño?
¿Qué no puedes hacer con la interfaz actual? ¿Qué beneficio concreto y significativo tomaría const std::string&
en el rendimiento de la interfaz?
El beneficio real de una sobrecarga de std::string
, como yo lo veo, es una ayuda para los principiantes, por lo que es fácil hacer las cosas bien cuando primero intento usar std :: string y streams juntos. Para los desarrolladores experimentados de C ++, el costo trivial de escribir .c_str()
cuando sea necesario es insignificante en comparación con el resto del esfuerzo que .c_str()
desarrollo de código.
Porque IOStream se diseñó mucho antes de que parte de STL se integrara en la biblioteca estándar. Y la clase de cuerda se hizo después de eso. Fue bastante tarde en el proceso de estandarización y la modificación de IOStream no se consideró guardar.
Por cierto, como parte de los cambios menores pero convenientes en C ++ 0X, hubo una limpieza de este tipo de cosas.
Mi copia del estándar no está de acuerdo contigo. Dice que ambas son sobrecargas:
void open(const char* s, ios_base::openmode mode = ios_base::in);
void open(const string& s, ios_base::openmode mode = ios_base::in);
Sin embargo, esa copia del estándar es un borrador de la próxima versión del estándar, C ++ 0x.
La razón de esto es que la biblioteca iostreams
es anterior a std::basic_string
, y porque los diseñadores de la biblioteca no querían que alguien tuviera que #include <string>
y todo su equipaje asociado si no querían usarlo.