将字符串列表输出到ostream

时间:2013-01-09 09:56:59

标签: c++ iostream ostream

我想将字符串值列表输出到ostream。

我可以为此声明并实现重载功能:

ostream& operator<< (ostream &out, const list<string> &in);

...然后像

一样写
cout << value;

...但是至少有两种方法可以转储字符串列表:每行一个字符串或一行中用空格分隔的所有字符串(或者可能是其他分隔符)。

是否可以通过流控制来改变转储功能行为?

我想写一些像:

list<string> lst;
...
cout << print_as_multiline() << lst;

......和:

list<string> lst;
...
cout << print_as_one_line() << set_separator (", ") << lst;

2 个答案:

答案 0 :(得分:0)

我有个主意......你能测试一下吗? 在您的运算符中&lt;&lt;实现文件创建一个全局的静态??变量字符串Separator = def sep(“,”)。

在你的&lt;&lt;中使用它(并在返回重置之前定义? - 你的决定)

创建一个类set_separator,在与&lt;&lt;相同的文件中实现构造函数。在此构造函数中,将Separator设置为参数。

定义一个新运算符&lt;&lt;对于类set_separator,不执行任何操作,只需返回流。

与多行输出相似。

答案 1 :(得分:0)

有几种选择:   - 编写多个函数或以分隔符作为参数的函数。   - 将分隔符附加到流。您可以使用iostream的xalloc()函数来分配自定义属性槽(它应该只分配一次,然后应用于所有流)。然后,您可以使用流“iword()pword()成员函数来访问附加的信息。还有一个可以挂钩的事件,因此在例如自动调用时会调用自定义函数。溪流被毁坏了。如有必要,使用它来释放动态分配的内容。   - 创建一个所谓的facet来处理列表格式。此方面附加到流的区域。

我的建议:采取第一种选择,这是最简单和最直接的选择。如果您需要在一个地方决定格式,但实际上在完全不同的地方使用它,请使用第二个。在考虑第三个选项之前,请阅读Langer&amp; Kreft C ++ IOStreams和Locales。 ;)