Ответ 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 в код С++ в порядке; в таких случаях (и только в таких случаях) я бы подумал об использовании этого.