我不明白这个ostream函数声明意味着什么:
ostream& operator<< (ostream& (*pf)(ostream&));
(具体来说,(*pf)(ostream&)
部分)。我想做点什么:
void print(ostream& os){
cout << os;
}
但是我收到了错误:
Invalid operands to binary expression ('ostream' . . . and 'ostream')
答案 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<<
效果:无。不像格式化输出函数(如27.7.3.6.1中所述)。
- 醇>
返回:
(basic_ostream<charT,traits>& (*pf)(basic_ostream<charT,traits>&))
。
还有一个pf(*this)
的重载,它接受一个类似的函数,但带有<<
参数和结果,还有一个带有std::basic_ios&
参数和结果的函数。
类std::ios_base
是iostreams类层次结构的基础,在该级别定义的标准操纵符是......:
格式标志操纵器:
std::ios_base
,boolalpha
,noboolalpha
,showbase
,noshowbase
,showpoint
,noshowpoint
,showpos
,{{ 1}},noshowpos
,skipws
,noskipws
,uppercase
和nouppercase
。
调整字段操纵器:
unitbut
,nounitbuf
和internal
。
数字系统基础操纵器:
left
,right
和dec
。
浮点数演示操纵器:
hex
,oct
,fixed
和scientific
。
采用用户参数的操纵符不遵循此表单,标准提供的操作符位于名为hexfloat
的单独标题中。
代码:
defaultfloat
输出,显示调用和返回,很好地缩进:
-> a -> b -> c <- c <- b <- a
答案 1 :(得分:2)
我不明白这个ostream函数声明意味着什么:
ostream& operator<< (ostream& (*pf)(ostream&));
您是否看到了std::endl
,std::flush
,std::hex
,std::dec
,std::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。