用户定义的参数化操纵器

时间:2012-11-26 10:46:45

标签: c++ iostream manipulators

我正在使用gcc 4.2.4。 根据Schildt,“C ++ The Complete Reference”,1995,用户定义的参数化操纵器应定义为:

istream &mymanip(istream &stream, type param)
{
    // here my code 
    return stream;
}
// overload 
imanip<type> mymanip(type param){
    return imanip<type>(mymanip, param)
}
// usage
cin >> mymanip(param);

我相信imanip(mymanip,param)应该返回一个包含mymanip和mymanip参数的对象。这应由重载运算符&gt;&gt;使用。打电话给mymanip。但是,这不起作用,imanip没有声明。

我也found这个版本:

IMANIP(int) fld(int n){
    return IMANIP(int)(fld,n);
    }

这也行不通。

我的问题是:

  1. gcc 4.2.4是否按照ANSI C ++标准进行了详细说明?如果确实如此,那么自1995年以来标准在这方面是否发生了变化?
  2. 为了定义我自己的参数化操纵器,我需要了解iostream代码并编写我自己的重载imanip和运算符&gt;&gt;功能?
  3. 无论问题2的答案是什么,我理解iostream代码的最佳策略是什么?我应该阅读代码吗?如何找出属于iostream的已编译库的名称?我应该读一本书吗?
  4. 感谢您的时间。

3 个答案:

答案 0 :(得分:2)

您发布的代码似乎脱离了上下文。 imanip看起来像某个模板,但该模板永远不会在代码中的任何位置定义。

但说实话,我甚至不会考虑使用1995年的C ++书。 1995年,C ++甚至没有标准化,尽管存在“带注释的参考手册”。你的书超过17年,在编程语言方面,这意味着“超过极端过时”。从那时起C ++已经发展了很多,你应该考虑购买一本更新的书,也许看看http://isocpp.org/get-started给你一些例子。

为您提供更具体的问题答案:

  1. 是的,gcc遵循这方面的标准,但你的书可能没有,因为它是预先标准的。
  2. 制作机器人,以便必须重新实现op&lt;&lt;和op&gt;&gt;再次。但是,根据您的操纵器设计要做的事情,您可能需要调用流或streambuf提供的一些较低级别的方法。
  3. “代码”不存在,有几个标准库的实现者,它们都有自己的,有时非常复杂的代码等。我建议在网上搜索有关这些库如何工作的信息。当然,一本书甚至更好。考虑购买N. Josuttis的“The C ++ Standard Library”。最新版本涵盖标准库“截至现在和将来”,即包括C ++ 11标准的增加。

答案 1 :(得分:2)

您的问题是Schildt正在阅读的内容。将来,不要把钱浪费在Bullschildt上。

答案 2 :(得分:0)

我通过阅读顺序学习了“用户定义的参数化操纵器”:

  1. http://www.horstmann.com/cpp/iostreams.html,第3章。操纵器
  2. http://www.angelikalanger.com/Articles/C++Report/Manipulators1.pdf - 它重复前一个但不错的
  3. http://www.angelikalanger.com/Articles/C++Report/Manipulators2.pdf - 尽可能复杂