studio programacion móviles libros libro desarrollo desarrollar curso aprende aplicaciones c++ stream ostream default-parameters

c++ - móviles - manual de programacion android pdf



Plataforma independiente/dev/null en c++ (3)

Posible duplicado:
Implementando un std no-op :: ostream

¿Hay alguna secuencia equivalente de NULL en c ++? Quiero escribir una función que tome en una secuencia si el usuario quiere que la salida sea interna en algún lugar, pero si no, la salida entra en algún lugar falso

void data(std::stream & stream = fake_stream){ stream << "DATA" ; }

Quiero poder elegir hacer data() o data(std::cout)


El archivo / dev / null de Linux es un agujero negro como el que está buscando. En Windows hay un dispositivo llamado NUL :. Nunca he intentado abrir ese archivo, pero lo he usado desde la línea de comandos


puede probar ostream (NULL, falso), la primera entrada es la salida de destino y no sé lo que significa la segunda entrada exactamente, pero después del código de rastreo parece que ostream no tiene lugar para escribir, llamar al operator << es solo ignorado por ostream. Me refiero a que en el primer estado de llamada los cambios son malos y después de eso siempre se ignoran los datos de entrada debido al estado de la transmisión, por lo que puede usar el siguiente código:

void data(std::ostream & stream = ostream(NULL,false)){ stream << "DATA" ; }


Edit : Tomado de @Johannes Schaub - el correo de litb here con ligeras modificaciones:

template<typename Ch, typename Traits = std::char_traits<Ch> > struct basic_nullbuf : std::basic_streambuf<Ch, Traits> { typedef std::basic_streambuf<Ch, Traits> base_type; typedef typename base_type::int_type int_type; typedef typename base_type::traits_type traits_type; virtual int_type overflow(int_type c) { return traits_type::not_eof(c); } }; // convenient typedefs typedef basic_nullbuf<char> nullbuf; typedef basic_nullbuf<wchar_t> wnullbuf; // buffers and streams // in some .h extern std::ostream cnull; extern std::wostream wcnull; // in a concrete .cpp nullbuf null_obj; wnullbuf wnull_obj; std::ostream cnull(&null_obj); std::wostream wcnull(&wnull_obj);

Usa esos:

void data(std::ostream& stream = cnull){ // whatever... }

Ahora, esto se ve bien y todo, pero lo siguiente es mucho más corto y funciona, porque si se proporciona un puntero nulo al constructor de ostream , establece automáticamente el badbit e ignora silenciosamente cualquier escritura:

// in .h extern std::ostream cnull; extern std::wostream wcnull; // in .cpp std::ostream cnull(0); std::wostream wcnull(0);

El estándar garantiza que esto funcione, comenzando desde 27.6.2.2 [lib.ostream.cons] p1 que describe el constructor de ostream que lleva un puntero a un streambuf :

Efectos: construye un objeto de la clase basic_ostream , asignando valores iniciales a la clase base llamando a basic_ios<charT,traits>::init(sb) .

La función relevante de basic_ios , 27.4.4.1 [lib.basic.ios.cons] p3 :

void init(basic_streambuf<charT,traits>* sb);
Postcondiciones: Las postcondiciones de esta función se indican en la Tabla 89:

La fila importante de la Tabla 89:

rdstate () - goodbit si sb no es un puntero nulo, de lo contrario badbit.

Lo que sucede si se configura el badbit se describe en 27.6.2.6 [lib.ostream.unformatted] :

Cada función de salida sin formato comienza su ejecución al construir un objeto de clase sentry . Si este objeto devuelve verdadero, mientras se convierte a un valor de tipo bool, la función intenta generar la salida solicitada.

Esto implica que, en caso de que el sentry sea ​​falso, no lo hace. Aquí es cómo el sentry convierte a bool , tomado de 27.6.2.3 [lib.ostream::sentry] p3 & p5 :

3) Si, después de que se haya completado cualquier preparación, os.good() es true , ok_ == true contrario, ok_ == false .

5) operator bool();
Efectos: Devuelve ok_.

( ok_ es un miembro de ostream::sentry de tipo bool ).

Tenga en cuenta que estas citas todavía están presentes en C ++ 11, solo en diferentes lugares. En orden de aparición en esta respuesta:

  • 27.6.2.2 [lib.ostream.cons] p1 => 27.7.3.2 [ostream.cons] p1
  • 27.4.4.1 [lib.basic.ios.cons] p3 => 27.5.5.2 [basic.ios.cons]
  • Tabla 89 => Tabla 128
  • 27.6.2.6 [lib.ostream.unformatted] => 27.7.3.7 [ostream.unformatted] p1
  • 27.6.2.3 [lib.ostream::sentry] p3 & p5 => 27.7.3.4 [ostream::sentry] p4 & p5