передача аргумента объекту

Я создал простое решение для вашего тестового примера, не используя <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. Надежная реализация, вероятно, определит эти

0
задан barbsan 16 January 2019 в 08:21
поделиться