#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
Функция 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
передается как указатель на функцию, которая вызывается с потоком в качестве аргумента.
Это работает (код в вопросе):
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"
Ваша функция рассматривается как манипулятор ostream.