#include <iostream>
using namespace std;
ostream& point(ostream& s) //Point a manipulator func
{
s << "-->";
return s;
}
int main()
{
cout << point << 10;
return 0;
}
// --------------------------------------------- ---------------------------- //
答案 0 :(得分:1)
糟糕。
该功能有几个错误。
无论cout
是什么,它都直接流到s
。因此,如果您将point
流式传输到另一个流,而不是cout
,则结果将放在错误的位置。
它缺少一个return
语句,因此您的程序具有未定义的行为。您的编译器应该已经对此发出警告。您应该再次返回流以允许链接。这是IOStream期望的约定。
可以这样正确地写:
ostream& point(ostream& s)
{
s << "-->";
return s;
}
此版本“有效”是因为IOStreams被专门设计为接受这种形式的“指向功能的指针”,并以对流的引用作为其第一个参数来执行它。这是一个功能。 IO机械手(包括endl
!)就是他们的工作。
答案 1 :(得分:0)
以某些函数指针作为参数,输出流类具有一些重载。特别是,有一个输出运算符声明为(忽略实际涉及模板):
std::ostream& std::ostream::operator<< (
std::ostream& (*manip)(std::ostream&));
调用此运算符时,它自己调用传递的函数,即类似这样的内容:
manip(*this);
也就是说,“插入”这样的 manipulator 函数会导致以流作为参数来调用该函数。