【发布时间】:2020-08-14 23:38:28
【问题描述】:
下面的代码将一个向量打印到std::cout。
struct vect {
double x;
double y;
};
std::ostream& operator<<(std::ostream& os, vect v){
os << "[" << v.x << " " << v.y << "]";
return os;
}
int main(){
vect v = {1.0, 2.0};
std::cout << v << std::endl;
return 0;
}
控制每个字段的宽度/精度的好方法是什么?我可以把它硬编码到operator<<:
std::ostream& operator<<(std::ostream& os, vect v){
os << "[" << std::setprecision(3) << std::setw(7) << v.x << " " << std::setprecision(3) << std::setw(7) << v.y << "]";
return os;
}
但我宁愿从外部控制它:
std::cout << std::setprecision(3) << std::setw(7) << v << std::endl;
但是我认为这只会设置向量第一个字段的精度和宽度。
我的想法是首先在operator<< 的开头“getw”和“getprecision”,然后将它们持久化到其他字段。有没有办法从流中检索这些东西,这个基本设计是否基于正确的假设? (我对 iomanipulators 的工作方式不是很有信心;我只知道在数据之前发送std::setw。)
【问题讨论】:
-
@Ron 谢谢;我知道。但是在打印下一个字段后修改会恢复,不是吗?
-
令人困惑的是,您将类型命名为与标准库类型相同的名称,而标准库类型却截然不同。
-
@KennyOstrom 同意。这是一个假名字,我从不使用
using namespace。会改变的。 -
当我测试它时,精度似乎在流中持续存在。
-
@Ron 哦,好的。但由于
std::setw不粘,我猜这个问题或多或少不受影响。
标签: c++ c++17 iostream cout iomanip