sirve que para libreria descargar cerr c++ iostream

que - Biblioteca estándar de C++: ¿Cómo escribir wrappers para cout, cerr, cin y endl?



include iostream c++ (2)

Por qué no

using std::cin; using std::cout;

¿y así? Luego, en su código puede usar cin , cout , y demás, sin inyectar accidentalmente todo el resto del std nombres std en su código.

No me gusta using namespace std , pero también estoy cansado de tener que escribir std:: delante de cada cout , cin , cerr y endl . Entonces, pensé en darles nuevos nombres más cortos como este:

// STLWrapper.h #include <iostream> #include <string> extern std::ostream& Cout; extern std::ostream& Cerr; extern std::istream& Cin; extern std::string& Endl; // STLWrapper.cpp #include "STLWrapper.h" std::ostream& Cout = std::cout; std::ostream& Cerr = std::cerr; std::istream& Cerr = std::cin; std::string _EndlStr("/n"); std::string& Endl = _EndlStr;

Esto funciona. Pero, ¿hay algún problema en lo anterior que me falta? ¿Hay una mejor manera de lograr lo mismo?


Alex te ha dado una respuesta sobre cómo resolver sintácticamente ese problema. Sin embargo, quiero señalar otros dos argumentos con respecto a este tema:

  1. No importa si está utilizando una directiva de uso ( using namespace std ) o su hermana malvada menor, una declaración de using std::cout ( using std::cout ), la sobrecarga puede llevar a sorpresas desagradables. No es mucha molestia escribir std:: comparación con pasar la mitad de una noche depurando para encontrar su código llamado std::distance() lugar de su propia función de distance() , simplemente porque cometió un pequeño error y std::distance() accidentalmente es una mejor coincidencia.

  2. Una línea de código se escribe una vez , pero, dependiendo de su tiempo de vida, se lee decenas, cientos y algunas incluso miles de veces . Por lo tanto, el tiempo que toma escribir una línea de código simplemente no importa en absoluto , lo importante es solo el tiempo que lleva leer e interpretar una línea de código . Incluso si toma tres veces más escribir una línea con el std:: adecuado en su lugar, si hace que leer solo 10% más rápido, vale la pena.
    Entonces, la pregunta importante es: ¿es más fácil leer e interpretar una línea de código con todo el std:: en su lugar o es más difícil ? De otra respuesta :

    Aquí hay un punto de datos más: hace muchos, muchos años, también solía encontrar molesto tener que prefijar todo de la biblioteca estándar con std:: . Luego trabajé en un proyecto en el que se decidió desde el principio que tanto el using directivas como las declaraciones están prohibidas a excepción de los ámbitos funcionales. ¿Adivina qué? Nos tomó a la mayoría de nosotros algunas semanas para acostumbrarnos a escribir el prefijo y después de algunas semanas más, la mayoría de nosotros incluso estuvo de acuerdo en que realmente hacía el código más legible . (Hay una razón para eso: si le gusta la prosa más corta o más larga es subjetiva, pero los prefijos agregan claridad al código de manera objetiva. No solo el compilador, sino que también a usted le resulta más fácil ver a qué identificador se hace referencia).

    En una década, ese proyecto creció hasta tener varios millones de líneas de código. Dado que estas discusiones surgen una y otra vez, una vez me di cuenta de la frecuencia using que se usaba el using alcance de la función (permitido) en el proyecto. Aprecié las fuentes y solo encontré una o dos docenas de lugares donde se usó. Para mí, esto indica que, una vez probados, los desarrolladores no encontraron std:: suficientemente doloroso para emplear el uso de directivas incluso una vez cada 100kLoC, incluso donde se permitió su uso .

    Creo que es triste que cada libro y tutorial encuentre skips std:: , porque eso hace que la gente se acostumbre a leer el código de esa manera. Cuando enseñé C ++ durante varios años (después de la experiencia mencionada), les dije a mis alumnos que no quería ver ninguna directiva ni declaración en el código. (La única excepción a esa regla es using std::swap , BTW, que necesitará para swap(a,b) las sobrecargas fuera del espacio de nombres std ). Una vez que se acostumbraron, no lo hicieron. t mente y, cuando se le preguntó al respecto, dijeron que encuentran el código sin el prefijo std:: confuso. Algunos incluso agregaron el prefijo std:: al código que escribieron de un libro o tutorial que no lo tenía .

En pocas palabras: ¿Qué hay tan difícil acerca de tipear std:: que todo el mundo se emociona al respecto? Ahora lo he estado haciendo durante> 15 años, y no echo de menos using en absoluto.