点操纵器功能如何工作?

时间:2018-12-01 20:13:58

标签: c++ iostream ostream

#include <iostream>

using namespace std;

ostream& point(ostream& s)  //Point a manipulator func
{       
    s << "-->";
    return s;

}

int main()    
{    
    cout << point << 10;
    return 0;
}

// --------------------------------------------- ---------------------------- //

2 个答案:

答案 0 :(得分:1)

糟糕。

该功能有几个错误。

  1. 无论cout是什么,它都直接流到s。因此,如果您将point流式传输到另一个流,而不是cout,则结果将放在错误的位置。

  2. 它缺少一个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 函数会导致以流作为参数来调用该函数。