Ho creato una classe Vector
in C++ e funziona perfettamente per i miei problemi. Ora sto pulirlo, e mi sono imbattuto nel seguente frammento di codice:Uso efficace della libreria iomanip C++
std::ostream& operator<<(std::ostream &output, const Vector &v){
output<<"["
<<std::setiosflags(std::ios::right | std::ios::scientific)
<<std::setw(23)
<<std::setprecision(16)
<<v._x<<", "
<<std::setiosflags(std::ios::right | std::ios::scientific)
<<std::setw(23)
<<std::setprecision(16)
<<v._y<<", "
<<std::setiosflags(std::ios::right | std::ios::scientific)
<<std::setw(23)
<<std::setprecision(16)
<<v._z<<"]";
return output;
}
Il codice consente di stampare un vettore come std::cout<<v<<std::endl;
. Ogni numero ha 23 spazi, di cui 16 sono i decimali. Il testo è allineato a destra in modo che stamperà:
1.123456123456e+01
-1.123456123456e+01
Invece di
1.123456123456e+01
-1.123456123456e+01
Il codice sembra terribilmente ripetitivo. Come si può "memorizzare" il formato (tutte le istruzioni , setw
e setprecision
) in modo tale che si può dire qualcosa come "stampare i caratteri in modo standard, ma i numeri con questo dato formato".
Grazie!
Modifica
Come da commento Rob Adams', ho cambiato il mio codice brutto (che, come sottolineato da altri, sarebbe rovinare la precisione per il 'prossimo ragazzo') per una più sintetica (e corretto):
std::ostream& operator<<(std::ostream &output, const Vector &v){
std::ios_base::fmtflags f = output.flags(std::ios::right | std::ios::scientific);
std::streamsize p = output.precision(16);
output<<"["
<<std::setw(23)<<v._x<<", "
<<std::setw(23)<<v._y<<", "
<<std::setw(23)<<v._z
<<"]";
output.flags(f);
output.precision(p);
return output;
}
Non proprio un duplicato di http://stackoverflow.com/questions/405039/permanent-stdsetw –