Ho bisogno di una classe che reindirizzi un ostream a un altro ostream durante la vita del suo oggetto. Dopo un po 'di ritmi, ho inventato questo:Reindirizzamento std :: cout
#include <iostream>
#include <fstream>
class ScopedRedirect
{
public:
ScopedRedirect(std::ostream & inOriginal, std::ostream & inRedirect) :
mOriginal(inOriginal),
mRedirect(inRedirect)
{
mOriginal.rdbuf(mRedirect.rdbuf(mOriginal.rdbuf()));
}
~ScopedRedirect()
{
mOriginal.rdbuf(mRedirect.rdbuf(mOriginal.rdbuf()));
}
private:
ScopedRedirect(const ScopedRedirect&);
ScopedRedirect& operator=(const ScopedRedirect&);
std::ostream & mOriginal;
std::ostream & mRedirect;
};
int main()
{
std::cout << "Before redirect." << std::endl;
std::ofstream filestream("redirected.txt");
{
ScopedRedirect redirect(std::cout, filestream);
std::cout << "During redirect." << std::endl;
}
std::cout << "After redirect." << std::endl;
return 0;
}
Sembra funzionare bene. Tuttavia, è strano che la seguente riga si ripete in sia il costruttore e distruttore:
mOriginal.rdbuf(mRedirect.rdbuf(mOriginal.rdbuf()));
Penso che sia corretto, ma vorrei verificare con il SO comunità. Riesci a trovare errori o pericoli in questo codice?
ModificaRendi non copiabile.
+1 - Dovrebbe essere corretto - ma sarebbe meglio se si implementato la logica in termini di una generica 'std :: ostream' piuttosto che chiamare' std :: cout' direttamente. –
@Billy ONeal: Is scopedRedirect non è già implementato in termini di ostream generico? Il codice std :: cout è utilizzato solo nel campione. – StackedCrooked
Non sto dicendo che la tua classe sia cattiva o scorretta. Sto solo dicendo che sarebbe meglio inviare l'output a dove vuoi che vada effettivamente piuttosto che reindirizzare dove sta andando dopo il fatto. Cioè, sto dicendo che il codice che si basa su std :: cout che punta a una particolare posizione dovrebbe essere refactored piuttosto che cambiare i punti cout. –