операторы — перегрузить власть правильно в c ++?

В C ++ я реализовал integer класс и я перегружен operator ^ быть степенной функцией.

integer integer::operator^ (const integer& rhs){
return integer(pow(this->.i, rhs.i));
}

Это работает правильно для двух операндов.

integer i1, i2, i3 ;
i4 = i1 ^ i2 ^ i3;

Значение i4 неправильно математически, потому что ассоциативность требуется справа налево. Как я могу решить эту проблему? Как мне изменить ассоциативность?

Я получил разумные ответы и узнаю:

-We can't change  associativity or priority of an operator.
-Good is Not to overload operators to do something conceptually different to
the built-in versions
-Even compiler can't support; it hard to implement!

3

Решение

Вы не можете изменить ассоциативность или приоритет оператора в C ++, перегрузив его. Эти правила встроены в синтаксис языка.

Стандарт C ++ говорит (§13.5.6, выделение мое):

Операторная функция должна быть нестатической функцией-членом или не-функцией и иметь
по крайней мере один параметр, тип которого является классом, ссылкой на класс, перечислением или ссылкой на
перечисление. Невозможно изменить приоритет, группировку или количество операндов операторов.
Смысл операторов =, (унарный) &и (запятая), предопределенные для каждого типа, могут быть изменены […]

Не только ^ оператор левоассоциативен, но он также имеет очень низкий приоритет. Правильный приоритет для оператора мощности должен быть выше, чем умножение (поэтому приоритет 4 или лучше в этой таблице), но он имеет приоритет 10 — это означает, что даже сложения и вычитания оцениваются перед ним. 1 + 2 ^ 3 * 4 будет проанализирован как (1 + 2) ^ (3 * 4)в то время как математически правильный оператор мощности должен разобрать как 1 + (2 ^ 3) * 4,

Если ассоциативность или приоритет оператора могут быть изменены, возникнет огромный, огромный синтаксический беспорядок. Мое скромное мнение, что вы не должны пытаться перегрузить ^ оператор, чтобы использовать его в качестве энергетического оператора. Я предпочел бы сделать power метод на занятии.

10

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]