¿cómo puedo enlazar un objeto std::ostream
a cualquiera std::cout
o para std::ofstream
, en función de una determinada condición programa? Aunque esto no es válida, por muchas razones, me gustaría lograr algo que es semánticamente equivalente a la siguiente:Obtener un std :: ostream ya sea desde std :: cout o std :: ofstream (archivo)
std::ostream out = condition ? &std::cout : std::ofstream(filename);
He visto algunos ejemplos que no son una excepción de seguridad, tales como uno de http://www2.roguewave.com/support/docs/sourcepro/edition9/html/stdlibug/34-2.html:
int main(int argc, char *argv[])
{
std::ostream* fp; //1
if (argc > 1)
fp = new std::ofstream(argv[1]); //2
else
fp = &std::cout //3
*fp << "Hello world!" << std::endl; //4
if (fp!=&std::cout)
delete fp;
}
¿Alguien conoce una mejor solución de excepción segura?
Ooh, me gusta std :: streambuf * mejor que std :: ostream * – Tom
, pero si algo falla, se quedará con un puntero colgando en la cola de su streambuf * del ahora destruido arroyo. así que ten cuidado, mejor escribe un método RAII. –
No me gusta secuestrar std :: cout. Significa que cout y printf ya no son equivalentes, algo que imagino que muchos desarrolladores dan por hecho. – Tom