我想将字符串值列表输出到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;
答案 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。 ;)