C ++ - 将一个ostream中的数据发送到另一个ostream

时间:2013-12-31 00:57:29

标签: c++ iostream

我不明白这个ostream函数声明意味着什么:

ostream& operator<< (ostream& (*pf)(ostream&));

(具体来说,(*pf)(ostream&)部分)。我想做点什么:

void print(ostream& os){
    cout << os;
}

但是我收到了错误:

 Invalid operands to binary expression ('ostream' . . . and 'ostream')

3 个答案:

答案 0 :(得分:2)

声明的含义。

正式的论点......

ostream& (*pf)(ostream&)

声明一个名为pf的参数,它是一个指针,您可以将一个参数括号应用于ostream&参数,该参数构成一个返回ostream&作为结果的调用。

它可以简化为......

ostream& pf(ostream&)

你可以更容易地看到它是一个功能。

缺点是这种形式很少使用,所以不是每个人都知道它衰变到第一种形式(与int x[43]大致相同,因为形式参数类型实际上与{{1}相同因为这两个形式在函数类型中只衰减到int x[],所以在函数体中你甚至可以增加int* x)。


它用于什么。

上述形式的功能通常是输出流操纵器。这意味着,您可以将其传递给x输出运算符。然后发生的事情就是<<调用函数,以stream作为参数,由C ++11§27.7.3.6.3/ 1和2指定:

  

<<   basic_ostream<charT,traits>& operator<<

     
      
  1. 效果:无。不像格式化输出函数(如27.7.3.6.1中所述)。

  2.   
  3. 返回:(basic_ostream<charT,traits>& (*pf)(basic_ostream<charT,traits>&))

  4.   

还有一个pf(*this)的重载,它接受一个类似的函数,但带有<<参数和结果,还有一个带有std::basic_ios&参数和结果的函数。

std::ios_base是iostreams类层次结构的基础,在该级别定义的标准操纵符是......:

  • 格式标志操纵器:
    std::ios_baseboolalphanoboolalphashowbasenoshowbaseshowpointnoshowpointshowpos,{{ 1}},noshowposskipwsnoskipwsuppercasenouppercase

  • 调整字段操纵器:
    unitbutnounitbufinternal

  • 数字系统基础操纵器:
    leftrightdec

  • 浮点数演示操纵器:
    hexoctfixedscientific

采用用户参数的操纵符不遵循此表单,标准提供的操作符位于名为hexfloat的单独标题中。

示例:用户定义的操纵器。

代码:

defaultfloat

输出,显示调用和返回,很好地缩进:

-> a
    -> b
        -> c
        <- c
    <- b
<- a

答案 1 :(得分:2)

  

我不明白这个ostream函数声明意味着什么:

ostream& operator<< (ostream& (*pf)(ostream&));

您是否看到了std::endlstd::flushstd::hexstd::decstd::setw ......等功能?可以使用“&lt;&lt;”将它们全部“发送”到流中,然后使用流作为函数参数调用它们并在流上执行它们的魔法。它们实际匹配上面的ostream& (*pf)(ostream&)参数,并且该运算符是允许它们使用的运算符。如果我们看一下Visual C ++实现......

 _Myt& operator<<(_Myt& (__cdecl *_Pfn)(_Myt&))
 {
      return ((*_Pfn)(*this));
 }

...你可以看到是否只是调用函数,将它用作参数的流传递给它。期望函数返回对相同流参数的引用,以便可以链接进一步的<<操作,或者可以将流隐式转换为bool作为流状态的测试。

有关io操纵器的更多信息,请参阅http://en.cppreference.com/w/cpp/io/manip

您需要帮助:

void print(ostream& os){
    cout << os;
}

这里的问题是你将ostream参数发送到另一个流 - cout - 而且它不知道你想用它做什么。

要将os的当前内容发送到cout,请尝试:

void print(ostream& os){
    cout << os.rdbuf();
}

或者,如果要将一些实际数据打印到由参数表示的流中:

void print(ostream& os){
    os << "show this!\n";
}

print(std::cout);   // to write "show this!\n" to `std::cout`
print(std::cerr);   // to write "show this!\n" to `std::cerr`

答案 2 :(得分:1)

声明的参数部分:

ostream& operator<< (ostream& (*pf)(ostream&));

函数指针语法。

表达式:

ostream& (*pf)(ostream&)

声明一个指向函数pf的指针,该函数接受ostream&参数并返回对ostream的引用。

如果我声明一个函数:

ostream& my_function(ostream& output);

然后我可以将指针传递给函数作为参数:

operator<< (my_function);

阅读函数指针语法。搜索Web和stackoverflow。