3
#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
4

3 に答える 3

9

関数currency()マニピュレーターです。ストリームクラスには、引数として特定のシグナチュアを持つ関数を受け取る特別なオーバーロードされた出力演算子があります。それらは次のようになります(テンプレート化が省略されています):

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、ストリームを引数として呼び出される関数ポインタとして渡されます。

于 2012-11-18T16:14:41.013 に答える
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"
于 2012-11-18T16:15:38.123 に答える
0

あなたの関数はostreamマニピュレーターとして扱われています。

于 2012-11-18T16:12:20.553 に答える