C++中的易写入及格式化区域和容器

ZDNet软件频道 时间:2002-08-08 作者:BUILDER.COM |  我要评论()
本文关键词:
这篇文章里,我将给你展示一个更好的在仍然使用操作符<<的情况下,提供一个给流编写区域和容器的界面的方式。
标准模板库(STL)提供了给STL流写入数值的方式。每种类型都具有重载操作符<<,它可以被写入任一个流。但是,这不总是最佳的解决方案,而且他也不支持数组。这篇文章里,我将给你展示一个更好的在仍然使用操作符<<的情况下,提供一个给流编写区域和容器的界面的方式。

首先,让我们来看看一个普通解决方案应该提供什么:

  1. 能够编写区域和容器。解决方案应该能为类似STL的区域工作并可以轻松编写容器。编写区域意味着我们可以通过提供一个[A, A + N]序列(A是数组,N是数组的大小)来编写C数组。
  2. 如果需要的话,能够包括每一个元素。例如,你可能需要编写这样一个数组:‘[John, James, Corina]’。
  3. 如果需要的话,能够对每一个元素实现转换。例如,你可能需要写入雇员的姓名,其中姓氏要用大写字母,就像是:[DOE, John; KEITH James; DYLAN, Richard]。或者你可能需要使用每一个元素的绝对值来编写一个整数数组。
  4. 前述两点中要有合理的缺省设置。例如,如果我们不应用转换,缺省转换应按照缺省设置打印元素。

通过这些性能的组合,你可以得到一个编写数组的有力途径。如果你还不确定,看一看这篇文章最后给出的例子。

实现解决方案

让我们将上面描述的解决方案分解开来对每一部分做一下个别的研究:

  • 要实现第一点,我们要有两个函数:rangecontainer
  • 要实现第二点,我们要有一个编写对象。
  • 要实现第三点,我们要有一个转换—含有两个参数的算符或是函数,两个参数是:编写的流和写入的值(注意:A算符是一个具有函数行为的对象。换句话说,他有一个重载操作符<<)。函数或是算符将对值进行转换并将其写入流。
  • 第四点将通过重载来实现。在给定参数的基础上,格式化工具函数将在所需要的地方给出缺省值。

我们将有几个编写区域和容器的函数来返回对象。对于每一个对象,我们都重载操作符<<,它将向目的流写入区域和容器。

例如,下面的代码创建一个可以编写aNames容器的对象,其中将应用操作符<<,它将依次将aNames写入std::cout

typedef std::list< std::string> StringsArray;
StringsArray aNames;
aNames.push_back( "John");
aNames.push_back( "James");
aNames.push_back( "Corina");
// will print the array of names
std::cout << container( aNames) << std::endl ;



百度大联盟认证黄金会员Copyright© 1997- CNET Networks 版权所有。 ZDNet 是CNET Networks公司注册服务商标。
中华人民共和国电信与信息服务业务经营许可证编号:京ICP证010391号 京ICP备09041801号-159
京公网安备:1101082134