左手操作数cout如何在这里传递?

时间:2012-11-18 16:09:36

标签: c++

#include <iostream>
#include <iomanip>
using namespace std;

ostream & currency(ostream & output)
{
    output << "RS ";
    return output;
}

int main()
{
    cout << currency  << 7864.5;
    return 0;
}

输出:

 RS 7864.5

我不明白这似乎是如何工作的,只是函数的名称currency 用于调用函数。 这不应该像currency(cout),但使用它会产生输出。

 RS 1054DBCC7864.5

3 个答案:

答案 0 :(得分:9)

函数currency()是一个操纵符:流类具有特殊的重载输出操作符,它将具有特定sigunature的函数作为参数。它们看起来像这样(模板化已被省略):

class std::ostream
    public std::ios {
public:
     // ...
     std::ostream& operator<< (std::ios_base& (*manip)(std::ios_base&));            
     std::ostream& operator<< (std::ios& (*manip)(std::ios&));         
     std::ostream& operator<< (std::ostream& (*manip)(std::ostream&));
};

也就是说,currency作为函数指针传递,并以流作为参数调用。

答案 1 :(得分:2)

这有效(问题中的代码):

std::cout << currency << 7864.5;

这样做:

currency(std::cout) << 7864.5;

你明显地尝试和抱怨但没有表现出来的是:

std::cout << currency(std::cout) << 7864.5;

这与:

相同
ostream& retval = currency(std::cout); // prints "RS " as you expect
std::cout << retval; // oops, this is cout << cout, which is meaningless
std::cout << 7864.5; // prints "7864.5"

答案 2 :(得分:0)

您的功能被视为ostream操纵器。