В настоящее время я переписываю код MATLAB в код C ++. Иметь возможность поднять «a» до степени «b», просто набрав «a ^ b», сделает мою жизнь намного проще, так как именно столько исходного кода было написано в MATLAB.
Есть ли способ сделать это? (Я использую примитивные типы)
Я с радостью приму решение, которое НЕ включает скобки и запятые, такие как метод pow (a, b).
Заранее спасибо.
Следующее работает, но вы должны скомпилировать со стандартом 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();
}
Пока это является возможна перегрузка ^
делать возведения в степень, вы не должны. Это плохая идея.
Ответ @ 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 ++, вы действительно должны учитывать три фактора: имя, приоритет и ассоциативность. Для хорошей перегрузки оператора все три должны быть правильными. Иногда разумно делать перегрузку, когда только двое из трех верны, а третий не слишком далеко. В этом случае только один из трех находится даже близко к праву; два других полностью неправильно.
Не делай этого. Это плохая идея.
За примитивные типы (ваш случай):
В C и в C ++ ^ является побитовым оператором XOR (exclusive-or).
Вам следует использование std::pow
возвести число в степень.
За не примитивные типы, вы могли бы однако перегрузить operator^
(но это не рекомендуется, так как вы пошли бы против обычного значения этого оператора)
Пример:
MyClass operator^(const MyClass& t1, const MyClass& t2)
{
//return ...
}
Вы не можете сделать это для примитивных типов. Вам нужно будет использовать std::pow
, Вы можете сделать это для пользовательских типов, перегружая ^
оператор, но это не может быть хорошей идеей, если XOR не имеет смысла для вашего типа.
(Через 10 минут после того, как я скажу, что кто-то придумает ужасный, ужасный хак для примитивных типов с пользовательским типом, неявными преобразованиями, пользовательским литералом и перегруженным ^
оператор).
pow () в cmath библиотеке. Больше информации о
кажется, вы ищете кого-то, чтобы сказать, написать ^ ^: D
Вы должны использовать предопределенные функции или написать новую;)