【问题标题】:user defined parameterized manipulators用户定义的参数化操纵器
【发布时间】:2012-11-26 10:46:44
【问题描述】:

我正在使用 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 参数的对象。这应该由重载的运算符使用>> 来调用 mymanip。但是,这不起作用,没有声明 imanip。

我也found这个版本:

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

这也不起作用。

我的问题是:

  1. gcc 4.2.4 在这个细节上是否遵循 ANSI C++ 标准?如果是,那么自 1995 年以来标准是否在这方面发生了变化?
  2. 为了定义我自己的参数化操纵器,我是否需要了解 iostream 代码并编写自己的重载 imanip 和 operator>> 函数?
  3. 不管问题 2 的答案,我理解 iostream 代码的最佳策略是什么?我应该阅读代码吗?如何找出属于 iostream 的已编译库的名称?我应该看书吗?

【问题讨论】:

  • 你遇到了什么错误?
  • 你遇到过“bullschildt”这个词吗?
  • @iammilind:错误:“imanip”未在此范围内声明。在使用 imanip 的第一行。我包括了#include &lt;iostream&gt; #include &lt;iomanip&gt;
  • 我发现一些库正在搜索包含 iomanip 标头的包,然后 grepping 到包中的文件。
  • @PlasmaHH 你说得对,这本书是一本很差的手册,它只是遵循标准而不是解释。我相信它也会遗漏一些东西,例如inherited functions are not overloaded

标签: c++ iostream manipulators


【解决方案1】:

您发布的代码似乎与上下文无关。 imanip 看起来像某个模板,但该模板从未在代码中的任何位置定义。

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

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

  1. 是的,gcc 在这方面遵循标准,但您的书可能不会,因为它是准标准。
  2. 制作了操纵器,因此您不必必须再次重新实现 op>。但是,根据您的操纵器的设计目的,您可能需要调用流或 streambuf 提供的一些较低级别的方法。
  3. “代码”不存在,有几个标准库的实现者,他们都有自己的,有时非常复杂的代码等等。我建议在网上搜索有关这些库如何工作的信息。当然,书更好。考虑购买 N. Josuttis 的“C++ 标准库”。最近的版本涵盖了“从现在到明天”的标准库,即包括添加的 C++11 标准。

【讨论】:

猜你喜欢
  • 2021-11-26
  • 2020-02-22
  • 2015-06-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-06
  • 1970-01-01
  • 2010-11-11
相关资源
最近更新 更多