gpt4 book ai didi

c++ - 获取 C++ 输出流中元素的大小

转载 作者:太空狗 更新时间:2023-10-29 21:09:33 27 4
gpt4 key购买 nike

我正在格式化一些日志输出。我希望最终结果如下所示:

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
}

是否有一种简洁的方法来实现我的目标?

最佳答案

正如发布的那样,这个问题有点像 X-Y 问题,因为您不需要知道宽度即可获得所需的输出。为此,知道总数就足够了 width的领域,并使用合适的fill性格。

这应该适合你:

std::ostream& operator<<(std::ostream& log, const Entry& e)
{
auto beg = log.tellp();
log << e.name_;
auto len = log.tellp() - beg;
auto oldFill = log.fill();
auto oldWidth = log.width();
log.fill('.');
log.width(line_width - len);
log << e.value_;
log.fill(oldFill);
log.width(oldWidth);
return log;
}

[Live example]

请注意,这依赖于流实际上能够通过 tellp() 报告有效值。基于文件的流是; std::cout 连接到终端不是。

关于c++ - 获取 C++ 输出流中元素的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58095890/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com