C.中用户定义的输出流操纵器

User-defined Output Stream Manipulators in C

本文关键字:输出流 操纵 定义 用户      更新时间:2023-10-16

我正在学习C++,在用户定义的输出流操纵器部分,我被卡住了。这是示例代码:

    #include <iostream>
     using std::cout;
     using std::flush;
     using std::ostream;
    ostream& endLine( ostream& output )
    {
      return output << 'n' << flush;
    }
    int main()
    {
       cout << "Testing:" << endLine;
       return 0;
    }

我的问题是,在endLine的定义中,有一个论点。但在主函数中,为什么它是endLine,而没有括号和根据参数。

std::basic_ostream有几个operator<<的重载,其中一个具有以下签名:

basic_ostream& operator<<( basic_ostream& st, 
                       std::basic_ostream& (*func)(std::basic_ostream&) );

也就是说,此函数获取一个指向同时获取和返回std::ios_base的函数的指针。该方法由该函数调用,并合并到输入/输出操作中。从而使这成为可能:

std::cout << endLine;

因此,endLine将被转换为函数指针,一个新行字符将被写入流,然后进行刷新操作。

std::ostream有一个operator<<重载,它将指针指向接受指针的函数(或者可以调用的类似函数),并调用该函数,将自身作为参数传递给函数:

std::ostream &operator<<(std::ostream &os, ostream &(*f)(ostream &os)) { 
    return f(*this);
}

ostream内置的版本来自std::ios_base(这是它用于参数和返回的类型),但如果您试图编写自己的版本,通常需要使用std::ostream

cout的左移运算符调用endLinecout作为参数。函数(从技术上讲是函数指针)在编写它们的名称时不需要调用;您可以将它们作为值传递,然后让其他代码稍后调用它们。