Определить псевдоним для оператора - PullRequest
0 голосов
/ 03 марта 2019

В C ++ я могу определить псевдоним существующего типа с помощью оператора typedef.Но можно ли создать псевдоним для оператора?Если быть точным, я хочу выбрать символ Unicode и создать псевдоним для оператора <<.

Я хотел бы использовать, например, "Вертикальные четыре точки" U+205E:

cout 
⁞ endl ⁞ "filename:      " ⁞ cfgfilename
⁞ endl ⁞ "message:       " ⁞ e.what() 
⁞ endl ⁞ "exception id:  " ⁞ e.id
⁞ endl ⁞ "byte position: " ⁞ e.byte ;   

Вместо этого:

cout 
<< endl << "filename:      " << cfgfilename
<< endl << "message:       " << e.what() 
<< endl << "exception id:  " << e.id
<< endl << "byte position: " << e.byte ;   

Если это невозможно ссимвол Четырех точек, но некоторые другие символы также могут быть опцией (хотя было бы хорошо иметь больше опций, чем базовый ASCII).

Ответы [ 2 ]

0 голосов
/ 03 марта 2019

C ++ позволяет только операторам перегружаться , а не вновь определенным .Таким образом, вы можете переопределить то, что делает <<, но вы не можете определить новый оператор, такой как .

Это, безусловно, было рассмотрено в ходе эволюции языка и самого Бьярна Страуструпа (парень, который написал C ++) объяснил, почему они решили не допустить этого:

Могу ли я определить свои собственные операторы?

Извините, нет.Возможность рассматривалась несколько раз, но каждый раз я / мы решали, что вероятные проблемы перевешивают возможные выгоды.Это не языково-техническая проблема.Даже когда я впервые рассмотрел это в 1983 году, я знал, как это можно реализовать.Тем не менее, мой опыт показывает, что когда мы выходим за пределы самых тривиальных примеров, люди, похоже, имеют слегка отличающиеся мнения о «очевидном» значении использования оператора.Классическим примером является ** b ** c.Предположим, что ** было сделано, чтобы означать возведение в степень.Теперь должен ** ** b означает с (а ** б) ** с или ** (б ** с)?Я думал, что ответ был очевиден, и мои друзья согласились - и затем мы обнаружили, что не сошлись во мнении, какая резолюция была очевидной.Я предполагаю, что такие проблемы могут привести к незначительным ошибкам.

Лучшее, что вы можете сделать, это добавить шаг сборки, который заменяет на << перед передачей модуля компиляции компилятору.В зависимости от вашей среды сборки, это, вероятно, довольно просто с файлом make или эквивалентным ему.

Благодарность: я получил большое вдохновение от этого ответа .

0 голосов
/ 03 марта 2019

Существует список доступных операторов, доступных для перегрузки операторов.Таким образом, вы не можете создать оператор для своего пользовательского символа, который будет вашим оператором перегруженного пользовательского символа.

Кроме этого, C ++ стандарт определяет набор символов, который может использоваться для написания программ.Символы Юникода недопустимы в исходном файле C ++ в качестве имени для перегрузки оператора.

...