Я создал простое решение для вашего тестового примера, не используя <iomanip>
. Я не могу обещать, что один и тот же подход будет работать в реальной жизни.
Основной подход заключается в том, что cout << plusone
возвращает временный вспомогательный объект (PlusOnePlus
), который, в свою очередь, имеет перегруженный operator <<
который выполняет добавление.
Я тестировал его в Windows:
PlusOne plusone;
cout << plusone << 41
производит «42», как и ожидалось. Вот код:
class PlusOnePlus {
public:
PlusOnePlus(ostream& os) : m_os(os) {}
// NOTE: This implementation relies on the default copy ctor,
// assignment, etc.
private:
friend ostream& operator << (PlusOnePlus& p, int n);
ostream& m_os;
};
class PlusOne {
public:
static void test(ostream& os);
};
PlusOnePlus operator << (ostream& os, const PlusOne p)
{
return PlusOnePlus(os);
}
ostream& operator << (PlusOnePlus& p, int n)
{
return p.m_os << n + 1;
}
void PlusOne::test(ostream& os)
{
PlusOne plusone;
os << plusone << 0 << endl;
os << plusone << 41 << endl;
}
EDIT: прокомментировал код, чтобы указать, что я полагаюсь на конструктор копирования по умолчанию (и т. Д.) Для PlusOnePlus
. Надежная реализация, вероятно, определит эти