Можно ли вызвать оператор << с использованием префиксной записи?

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

2 ответа

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

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

Следовательно, int a = +(2, 3) такой же как int a = 3, и нет int a = 2 + 3

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

Нет, не можешь.

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

operator+ вместо того +

operator<< вместо того <<

Примечание:

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

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

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

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

int a = +(2, 3);

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

Ты не можешь этого сделать

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

потому как ints - фундаментальные типы.

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

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

такой же как

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

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

Другие вопросы по тегам