Creé una clase Vector
en C++ y funciona muy bien para mis problemas. Ahora estoy limpiando para arriba, y me encontré con el siguiente fragmento de código:Uso efectivo de la biblioteca iomanip de 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;
}
El código permite imprimir un vector como std::cout<<v<<std::endl;
. Cada número tiene 23 espacios, de los cuales 16 son los decimales. El texto está alineado a la derecha para que se imprimirá:
1.123456123456e+01
-1.123456123456e+01
En lugar de
1.123456123456e+01
-1.123456123456e+01
El código parece muy repetitivo. ¿Cómo se puede "almacenar" el formato (todas las declaraciones , setw
y setprecision
) para que pueda decir algo así como "imprimir los caracteres de forma estándar, pero los números con este formato dado".
¡Gracias!
Edición
Según comentario Rob Adams, he cambiado mi código feo (que, como se ha señalado por otros, lo arruinaba la precisión para el 'tipo de al lado') a una más breve (y correcto):
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;
}
No es exactamente un duplicado de http://stackoverflow.com/questions/405039/permanent-stdsetw –