Код, приведенный ниже, печатает вектор в 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;
Однако я думаю, что это только установит точность и ширину для первого поля вектора.
Я имею в виду сначала «getw» и «getprecision» в начале operator<<
, а затем перенести их в другие поля. Есть ли способы извлечь эти вещи из потока, и основывается ли этот базовый проект на правильных предположениях? (Я не очень уверен в том, как работают iomanipulator; я просто знаю, чтобы отправить std::setw
перед данными.)