Как правильно перегрузить & lt; & lt; оператор?

Я пишу свой собственный целочисленный класс, который может обрабатывать целые числа любого размера. До сих пор я успешно перегрузил следующие операторы: =, +, -, *, /,%,>, <,> =, <=, ==,! =, + =, — =, * =, / = и% =.

Теперь я пытаюсь перегрузить << оператор для имитации поведения int в следующих строках кода:

int a = 5;
std::cout << a;

Я долго смотрел, как это сделать, и пока все, что я нашел, это:

std::ostream& operator<<(std::ostream& os, const T& obj)
{
// Write obj to stream
return os;
}

Но это похоже на то, что если бы я хотел что-то направить в мой объект (то есть иметь << на правой стороне моего объекта). Но я хочу изменить поведение << когда он находится на левой стороне моего объекта.

Как я могу настроить operator<< функция, позволяющая мне передавать данные в cout (или любой другой ostream)?

1

Решение

Как я могу настроить оператора<< функция, позволяющая мне передавать данные в cout (или любой другой ostream)?

То, как вы сделали здесь:

std::ostream& operator<<(std::ostream& os, const T& obj)
{
// write obj to stream
return os;
}

Как полезно отмечали другие в комментариях, вам нужно будет поместить его вне ваших целочисленных классов, чтобы он был «свободной функцией». Он все еще может быть членом ваших целочисленных классов, но да, это так.

Но это, кажется, для того, чтобы я хотел что-то направить в мой объект. (то есть имея << на правой стороне моего объекта). Но я хочу изменить поведение << когда он находится на левой стороне моего объекта.

Я не уверен, откуда вы это взяли, но первый аргумент — это левый аргумент, который является выходным потоком в вашем случае, а второй — экземпляр вашего целочисленного класса, который записывается в этот выходной поток.

2

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

В потоках C ++,

std::cout << a;

это просто синтаксический сахар для

operator<<(std::cout, a);

которая соответствует подписи

std::ostream& operator<<(std::ostream& os, const int &a);

Так же,

std::cout << myBigInt;

будет синтаксическим сахаром для

operator<<(cstd::cout, myBigInt);

Поэтому размещенный вами фрагмент включает синтаксис

os << obj; // os is an ostream; obj is a T

Другими словами, << находится на левой стороне obj и / или myBigInt поскольку бинарный оператор находится между двумя операндами, которые вы видите в списке аргументов функции.

1

По вопросам рекламы [email protected]