Подтвердить что ты не робот

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

Как предыдущая заметка: Это не то, чего я "желал бы" достичь; более того, вопрос, связанный с тем, действительно ли это возможно.

N.B. Я понимаю (и использовал) Overloding оператора в С++. Например:

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

Возможно ли определить пользовательский символ ASCII для работы в качестве оператора?

Например, в простом смысле: используйте серьезный акцент (`) как "псевдоним" для std:: pow.

Таким образом, было бы справедливо/выполнимо следующее утверждение:

std::cout << 2`3 << std::endl;

>> 8
4b9b3361

Ответ 1

Вы не можете ввести символ, отсутствующий в синтаксисе, например, упомянутый вами обратный ход. Но есть трюк "named operator" , с помощью которого вы можете ввести "named operator" для достижения следующего синтаксиса:

std::cout << (2 <Pow> 3) << std::endl;

Трюк полагается на перегрузку < и > для настраиваемого типа, например:

const struct PowOperator {} Pow;

struct PowInvoker
{
  int lhs;
};

PowInvoker operator< (int lhs, PowOperator)
{
  return {lhs};
}

int operator> (PowInvoker lhs, int rhs)
{
  return std::pow(lhs.lhs, rhs);
}

int main()
{
  std::cout << (2 <Pow> 3) << std::endl;
}

[Живой пример]

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


Отказ

Вышеупомянутый трюк - это "умный" код, он в значительной степени злоупотребляет синтаксисом С++. Я поставил вопрос как гипотетический "что возможно", и ответил с такой же гипотетической "это". Я бы не рекомендовал использовать это на практике для таких тривиальных вопросов, как замена std::pow или обеспечение синтаксиса "новизны" для этого. Оговорка о приоритете оператора, упомянутая выше, является одной из причин; общее незнание конструкции - другое. Качество кода измеряется количеством WTF, которое генерирует код (меньше - лучше), и этот трюк генерирует целую кучу (и большие).

Он по-прежнему использует его: для создания языка, специфичного для домена. В программировании есть случаи, когда встраивание DSL в код С++ в порядке; в таких случаях (и только в таких случаях) я бы подумал об использовании этого.

Ответ 2

Нет, это невозможно. Даже на уровне препроцессора вы ограничены символами, которые образуют действительные токены препроцессора и имена макросов, а затем языковая грамматика исправляет набор операторов на языке.