【问题标题】:Outputting list of strings to ostream将字符串列表输出到 ostream
【发布时间】:2012-12-23 08:10:45
【问题描述】:

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

【问题讨论】:

  • 为什么不只是std::copystd::ostream_iterator 可让您控制它们之间的内容。
  • 为了提高可读性
  • 字符串是空终止的,要打印的as_one_line,需要去掉\n
  • pretty printer 支持自定义分隔符。可能值得一试。
  • IMO,任何实现这种方法的尝试都将过于复杂,更简单的是有两个函数,print_multi()print_single(),它接受列表和流,然后简单地遍历并打印它out...代码清晰,意图明确...

标签: c++ iostream ostream


【解决方案1】:

我有个主意……你能测试一下吗? 在你的操作符

在你的

创建一个类 set_separator,构造函数的实现与你的

为类set_separator定义一个新的操作符

与多行输出类似。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-03
      • 1970-01-01
      • 2016-01-19
      • 1970-01-01
      • 2014-06-24
      • 1970-01-01
      相关资源
      最近更新 更多