matlab — Как использовать каретку & quot; ^ & quot; в C ++ для возведения в степень

В настоящее время я переписываю код MATLAB в код C ++. Иметь возможность поднять «a» до степени «b», просто набрав «a ^ b», сделает мою жизнь намного проще, так как именно столько исходного кода было написано в MATLAB.

Есть ли способ сделать это? (Я использую примитивные типы)

Я с радостью приму решение, которое НЕ включает скобки и запятые, такие как метод pow (a, b).

Заранее спасибо.

0

Решение

Следующее работает, но вы должны скомпилировать со стандартом c ++ 11 (g ++ -std = c ++ 11 * .cpp):
Вы не можете использовать оператор XOR (^) для показателей с примитивами. Вы должны перегружать его в классе.

#include <iostream>
#include <cmath>
#include <ctgmath>

using namespace std;

class Number {
private:
float _num;
public:
Number(float num) : _num(num){}
Number operator^(const float& num) {
return Number(pow(_num,num));
}
float get() {
return _num;
}
};

int main() {
Number a = Number(5);
Number b = a^7;
cout << b.get();
}
3

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

Пока это является возможна перегрузка ^ делать возведения в степень, вы не должны. Это плохая идея.

Ответ @ AaronF показывает, насколько уродлив код, чтобы сделать это, но это только верхушка айсберга. реальный проблема возникает, когда вы пытаетесь использовать это в реальном коде. Проблемы проистекают из одного простого факта: перегрузка оператора изменяет действия, выполняемые этим оператором, но делает не влияет на приоритет или ассоциативность этого оператора. В случае ^, оба прецедента а также ассоциативность совершенно не подходит для возведения в степень.

старшинство

В C ++ ^ Оператор имеет довольно низкий приоритет. Возведение в степень должно иметь очень высокий приоритет. Например, если у меня есть выражение вроде x^y*z, Я бы хочу это значит (x^y)*z— но что это на самом деле означает x^(y*z), По факту, ^ имеет приоритет даже ниже, чем сложение и вычитание, поэтому x^y+z выходит неправильно — значит x^(y+z) вместо (x^y)+z что бы ты хотел.

Ассоциативность

Экспонирование является ассоциативным, но в C ++ ^ Оператор остается ассоциативным. Например, учитывая выражение как x^y^zчто бы ты хочу было бы для этого значить x^(y^z), но то, что вы получите, (x^y)^z,

Результат

Это означает, что если вы делаете перегрузку operator^ чтобы возвести в степень, вы только ушли от использования имени pow, Ты сможешь не уйти от большинства скобок; в любом нетривиальном выражении вам все равно понадобятся скобки, чтобы принудительно установить правильный приоритет и ассоциативность, потому что, как указано выше, приоритет и ассоциативность, которые C ++ присваивает operator^ оба совершенно не подходят для возведения в степень.

Заключение

Хотя вы Можно перегрузка operator^ для возведения в степень, это одно из тех мест, где усмотрение — лучшая часть доблести. Когда вы перегружаете операторы в C ++, вы действительно должны учитывать три фактора: имя, приоритет и ассоциативность. Для хорошей перегрузки оператора все три должны быть правильными. Иногда разумно делать перегрузку, когда только двое из трех верны, а третий не слишком далеко. В этом случае только один из трех находится даже близко к праву; два других полностью неправильно.

Не делай этого. Это плохая идея.

5

  • За примитивные типы (ваш случай):

    В C и в C ++ ^ является побитовым оператором XOR (exclusive-or).
    Вам следует использование std::pow возвести число в степень.

  • За не примитивные типы, вы могли бы однако перегрузить operator^ (но это не рекомендуется, так как вы пошли бы против обычного значения этого оператора)

Пример:

MyClass operator^(const MyClass& t1, const MyClass& t2)
{
//return ...
}
2

Вы не можете сделать это для примитивных типов. Вам нужно будет использовать std::pow, Вы можете сделать это для пользовательских типов, перегружая ^ оператор, но это не может быть хорошей идеей, если XOR не имеет смысла для вашего типа.

(Через 10 минут после того, как я скажу, что кто-то придумает ужасный, ужасный хак для примитивных типов с пользовательским типом, неявными преобразованиями, пользовательским литералом и перегруженным ^ оператор).

1

pow () в cmath библиотеке. Больше информации о

http://en.cppreference.com/w/cpp/numeric/math/pow

0

кажется, вы ищете кого-то, чтобы сказать, написать ^ ^: D
Вы должны использовать предопределенные функции или написать новую;)

0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector