【发布时间】:2019-09-25 10:03:50
【问题描述】:
我正在格式化一些日志输出。我希望最终结果如下所示:
Foo.................................12.1
Bar....................................4
Foo Bar............................42.01
总宽度是恒定的,但两个参数(名称和值)都有不同的大小。一旦包含在 std::ostream 中,是否有一种干净的方法来获取给定参数的宽度?
#include <iostream>
struct Entry {
std::string name_;
double value_;
};
constexpr int line_width = 30;
std::ostream& operator<<(std::ostream& log, const Entry& e)
{
log << e.name_
<< std::string(line_width - e.name_.size(), '.') \\ should subtract the width of e.value_
<< e.value_;
return log;
}
int main()
{
Entry foo = { "Foo", 12.1 };
Entry bar = { "Bar", 4};
Entry foobar = { "Foo Bar", 42.01};
std::cout << foo << '\n' << bar << '\n' << foobar << '\n';
}
上面的代码不起作用,因为我没有减去值的宽度。我正在考虑编写一个可以执行以下操作的函数:
template <typename T>
int get_width(std::ostream& log, T value)
{
// 1. use tellp to get initial stream size
// 2. insert the value in the stream
// 3. use tellp to get final stream size
// 4. remove the value from the stream (is that even possible?)
// 5. return the size = final - initial
}
有没有一种干净的方法可以达到我的目标?
【问题讨论】:
-
name_和value_的最大输出长度是否提前知道?还是需要从数据中计算出这两个宽度的最大值,然后用它来确定布局? -
Value 是用户指定的双精度值。从技术上讲,它可以包含 15 位数字,但实际上人们使用 3 或 4。