1

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

2 回答 2

0

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

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

于 2013-01-12T23:33:55.970 回答
0

我有个主意……你能测试一下吗?在你的操作符 << 实现文件中创建一个全局的、静态的??变量字符串分隔符 = def sep (", ")。

在你的<<中使用它,(在返回重置到def sep之前?-你的决定)

创建一个类 set_separator,构造函数的实现与 <<. 在此构造函数中,将 Separator 设置为参数。

为类 set_separator 定义一个新的运算符 <<,什么都不做,只返回流。

与多行输出类似。

于 2013-01-09T10:18:48.543 回答