Можно ли вызвать оператор <<, используя префиксную нотацию? - PullRequest
0 голосов
/ 05 апреля 2020

Мне интересно, могу ли я написать, например: <<(object, cout); или <<(cout,object);, где объект - это определенный пользователем класс, у которого перегружен оператор <<, так же, как можно написать: int a = +(2,3); и получить ожидаемый результат, как в int a = 2 + 3;. Кроме того, что нужно делать, если это возможно, но требует нескольких шагов? Следует ли перегрузить оператор << двумя разными сигнатурами?

Ответы [ 2 ]

2 голосов
/ 05 апреля 2020

так, как можно было бы написать: int a = + (2,3); и получите ожидаемый результат, например: int a = 2 + 3;

Нет, у вас неправильное понимание. +(2, 3) будет go по ассоциативности оператора запятой и присвоит +3 (3) переменной a.

Следовательно, int a = +(2, 3) совпадает с int a = 3, а не int a = 2 + 3

Мне интересно, смогу ли я написать, например: << (object, cout); или << (cout, object); </p>

Нет, вы не можете.

Если вы хотите использовать операторы таким образом, вам следует назвать его полностью определенное имя, например:

operator+ вместо +

operator<< вместо <<

Примечание:

Это не будет работать для основных типов данных. При использовании перегруженных версий этих операторов позаботьтесь о области действия класса и пространствах имен.

1 голос
/ 05 апреля 2020

Вы можете сделать это, например,

operator<<(std::cout, "hi");

Это выражение

int a = +(2, 3);

не выполняет operator+. Сначала применяется оператор последовательности ,, который дает 3, а затем применяется унарный +, который дает 3.

Вы не можете сделать это

int a = operator+(2, 3); // error

, потому что int s являются фундаментальными типами.

Если у вас есть определенные пользователем типы S, то следующие фрагменты имеют то же значение

S s{};
std::cout << s;
auto x = s + s;

, что и

S s{};
operator<<(std::cout, s);
auto x = operator+(s, s);

, предполагая, что операторы определенный для S, будет вызван правильный оператор.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...