В 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!
Вы не можете изменить ассоциативность или приоритет оператора в C ++, перегрузив его. Эти правила встроены в синтаксис языка.
Стандарт C ++ говорит (§13.5.6, выделение мое):
Операторная функция должна быть нестатической функцией-членом или не-функцией и иметь
по крайней мере один параметр, тип которого является классом, ссылкой на класс, перечислением или ссылкой на
перечисление. Невозможно изменить приоритет, группировку или количество операндов операторов.
Смысл операторов =, (унарный) &и (запятая), предопределенные для каждого типа, могут быть изменены […]
Не только ^
оператор левоассоциативен, но он также имеет очень низкий приоритет. Правильный приоритет для оператора мощности должен быть выше, чем умножение (поэтому приоритет 4 или лучше в этой таблице), но он имеет приоритет 10 — это означает, что даже сложения и вычитания оцениваются перед ним. 1 + 2 ^ 3 * 4
будет проанализирован как (1 + 2) ^ (3 * 4)
в то время как математически правильный оператор мощности должен разобрать как 1 + (2 ^ 3) * 4
,
Если ассоциативность или приоритет оператора могут быть изменены, возникнет огромный, огромный синтаксический беспорядок. Мое скромное мнение, что вы не должны пытаться перегрузить ^
оператор, чтобы использовать его в качестве энергетического оператора. Я предпочел бы сделать power
метод на занятии.
Других решений пока нет …