Как левый операнд Cout передается здесь?

#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

Решение

Функция 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 передается как указатель на функцию, которая вызывается с потоком в качестве аргумента.

9

Другие решения

Это работает (код в вопросе):

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

Ваша функция рассматривается как манипулятор ostream.

0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector