C ++缩进重载ostream运算符

时间:2016-05-05 21:56:42

标签: c++ iostream

假设Ì有一些类,并通过重载左移运算符来增加输出功能:

struct Foo
{
    int i = 1;
    std::string s = "hello";
};

auto& operator<<(std::ostream& os, Foo const& foo)
{
     os<<foo.i<<"\n";
     os<<foo.s<<"\n";
     return os;
}

缩小输出的好方法是什么?

示例:如果我写

std::cout<<"    "<<Foo{}<<std::endl;

输出是:

    1
hello

显然,hello没有缩进。是否有一种简单的方法来缩进整个输出(而不仅仅是第一个元素)?

2 个答案:

答案 0 :(得分:1)

您是否正确序列化Foo对象?因此,逻辑上,Foo的序列化字符串是auto& operator<<(std::ostream& os, Foo const& foo) { auto s = "\t" + std::to_string(foo.i) + "\n" "\t" + foo.s; return (os << s); } int main() { std::cout << Foo{} << "\n"; } 的实现细节。你可以编写你自己的流类或类似的东西,但这是过度设计问题。

var keycloak = new Keycloak({ store: memoryStore });

答案 1 :(得分:0)

您可以使用标准库操纵器setw来设置字段的宽度,这通常会导致缩进文本。以下是您使用它的方式:

cout << std::setw(10) << "Viola!" << std::endl;

这将打印“Viola!”这个词。缩进4个空格。为什么4个空格? setw()的参数决定了“字段”的整个宽度,其中包括“Viola!”中的6个字符。

默认情况下,setw()会将文本对齐,但可以使用其他操纵符left对齐左侧。这是一个例子:

cout << std::setw(10) << std::left << "Viola!" << std::endl;

这将输出字符串“Viola!”没有缩进,但后面有4个空格。

这应该回答你关于缩进的好方法的原始问题,setw()不仅是一种好方法,而且是标准方式。

第二个问题是关于如何持续缩进,答案是没有简单的方法。最简单的方法是在每个cout调用中添加对setw()(或您使用的任何缩进方法)的调用。

除了这些答案之外,您还应考虑通过拨打cout来调用endl来代替“\ n”。 endl是“行尾”操纵器,可使您的代码与任何输出流一起正常工作。代码如下所示:

auto& operator<<(std::ostream& os, Foo const& foo)
{
     os << foo.i << std::endl;
     os << foo.s << std::endl;
     return os;
}