2011-01-09 9 views
5

Aquellos de nosotros que hemos visto la belleza de STL intenta utilizar tanto como sea posible, y también animar a otros a usarlo donde vemos el uso de punteros primas y matrices. Scott Meyers ha escrito un libro completo sobre STL, con el título Effective STL. Sin embargo, ¿qué pasó con los desarrolladores de ifstream que prefirieron char* sobre std::string. Me pregunto por qué el primer parámetro de ifstream::open() es del tipo const char*, en lugar de const std::string &. Por favor, eche un vistazo a su firma:Diseño de clase std :: ifstream

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 ningún motivo por el que hayan preferido char* sobre std::string. Tenga en cuenta que todavía podríamos 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 comentario en mi title.:P. Parece corto por eso lo usé.

La plantilla de clase real es:

template<class _Elem,class _Traits> class basic_ifstream; 
+0

Lo único que tienen en común las secuencias con el STL es que ambas son parte de la biblioteca estándar. __ Biblioteca estándar! = STL .__ – sbi

Respuesta

4

My copy of the standard de acuerdo con usted. Se dice que tanto estos 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 de la norma es un proyecto de la próxima versión de la norma, C++ 0x.

La razón de esto es que la biblioteca iostreams anterior std::basic_string, y porque los diseñadores de bibliotecas no querían a alguien a tener que #include <string> y todo lo que está asociado otro equipaje si no quieren usarlo.

+3

Probablemente estés viendo un borrador de C++ 0X. – AProgrammer

+0

@AProgrammer: Hmm ... no sabía que eso había cambiado. Agregué un enlace a la copia que estoy usando para aclararlo. –

+2

@Billy ONeal: eso no es C++ 03. Estoy hablando de C++ 03. – Nawaz

7

Debido iostream fue diseñado mucho antes parte de la STL se integró 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 de menor importancia, pero la comodidad en C++ 0X es que había una limpieza de este tipo de cosas.

0

Es por lo general no es más caro para obtener una cadena C de un std::string de lo que es para construir una std::string de una cadena C es así, dado que es probable que desee utilizar std::ifstream con nombres que vienen de ambos, usando un const char* en la interfaz no es un costo significativo.

¿Este es un grave error con el diseño?

¿Qué no puedes hacer con la interfaz actual? ¿Qué beneficio concreto y significativo sería tomar un const std::string& en el rendimiento de la interfaz?

El beneficio real de una sobrecarga de std::string, como lo veo, es una ayuda para los principiantes, lo que facilita las cosas al intentar usar std :: string y streams juntos. Para los desarrolladores de C++ con experiencia, el costo trivial de escribir .c_str() cuando sea necesario es probable que sea insignificante en comparación con el resto del esfuerzo que entra en el desarrollo del código.

+0

@ Charles Bailey: parece una racionalización post facto. : P – Nawaz

+0

@Nawaz: ¿Qué está pidiendo si no racionalización después del hecho (dado que la interfaz actual ya se ha estandarizado)? –

+0

@Charles Bailey: Quiero decir, si hubieran preferido 'std :: string' sobre' char * ', habrían dicho lo mismo. Justo en el orden inverso. Y seguiría siendo lógico:: ... mientras que mi pregunta era sobre por qué ellos mismos no usaron std :: string si no hay daño en ello. – Nawaz

Cuestiones relacionadas