c++ - 用户定义的参数化操纵器

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

我也是found这个版本:

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

这也行不通。

我的问题是:

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

最佳答案

您发布的代码似乎断章取意。 imanip 看起来像一些模板,但该模板从未在您的代码中的任何地方定义。

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

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

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

关于c++ - 用户定义的参数化操纵器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13563246/

相关文章:

C++货币输出

c++ - 使用 C++ 中的流操纵器在固定宽度字段中居中文本

c++ - 如何在不使用命名空间 std 的情况下取消设置 ios::fixed

c++ - iostream 限制要读取的最大字符数

c++ - 编译此开源应用程序时出现问题

c++ - 如何向 CPrintDialogEx 添加属性页

C++模板模板(双模板?)

c++ - GCC、std::ctype 特化和流

c++ - 每次启动我的 C++ 程序时,如何将我的数据输出到一个新的 csv 文件中?

C++ I/O 库