Оператор вставки C ++ для метода класса - PullRequest
0 голосов
/ 28 мая 2020

В C ++ есть способ использовать оператор вставки для метода класса?

Эта operator<< перегрузка работает:

class Complex {
public:
  //Normal overload:
  friend std::ostream& operator<<(std::ostream &out, const Complex &o) {
    out << "test overload";
    return out;
  }

  Complex() {};
  ~Complex() {};
};

Я могу сделать это:

int main()
{
  Complex* o = new Complex();

  std::cout << "This is test: " << *o << "." << std::endl; // => This is test: test overload.
}

Я знаю о манипуляторах потоков, например:

std::ostream& welcome(std::ostream& out)
{
    int data = 1;
    out << "WELCOME " << data << "\r\n";
    return out;
}

int main()
{
  std::cout << "Hello " << welcome; // => "Hello WELCOME 1\r\n"
}

Как я могу поместить метод welcome в класс Complex, а затем как его вызвать из cout (обратите внимание, что метод приветствия должен иметь доступ к некоторым переменным-членам класса)?

Моя пробная версия:

class Complex {
public:
  //Normal overload:
  friend std::ostream& operator<<(std::ostream &out, const Complex &o) {
    out << "test overload";
    return out;
  }

  std::ostream& welcome(std::ostream& out) {
    out << "WELCOME " << data << "\r\n";
    return out;
  }

  Complex() { data = 1; };
  ~Complex() {};
private:
  int data;
};

int main()
{
  Complex* o = new Complex();

  std::cout << "This is test2: " << o->welcome << std::endl; // compile error
}

1 Ответ

2 голосов
/ 29 мая 2020

Один простой способ выбрать другую << перегрузку - использовать другой тип.

#include <iostream>

class Complex {
public:
  //Normal overload:
  friend std::ostream& operator<<(std::ostream &out, const Complex &o) {
    out << "test overload";
    return out;
  }

  struct extra_info {
      const Complex& parent;
      extra_info(const Complex& p) : parent(p) {}
      friend std::ostream& operator<<(std::ostream& out, const extra_info& ei){
        int i = 1;
        out << "extrainfo " << i;
        return out;
      }
  };
  extra_info extrainfo() {
      return {*this};
  }

  Complex() {};
  ~Complex() {};
};


int main() {
    Complex c;
    std::cout << c << "\n";
    std::cout << c.extrainfo();
}

Вывод:

test overload
extrainfo 1

Я полагаю, что в вашем реальном коде вы используете члены. Следовательно, вспомогательный тип должен содержать ссылку на экземпляр Complex.

...