【问题标题】:Can I program an exponentiation operator in C++? [duplicate]我可以在 C++ 中编写求幂运算符吗? [复制]
【发布时间】:2017-06-24 00:46:57
【问题描述】:

在数值编程中,我经常想在表达式中将数字提升为幂。这导致代码出现数百次 pow(x,2) 或类似的东西。

这会使代码变得混乱,使其可读性和解析性降低,尤其是在将书面方程式与代码进行比较时。

如果可能的话,我想用 C++ 编写一个求幂运算符。

a^b == pow(a, b)

我尝试为operator()(double, double)operator[](double, double) 编写重载(之所以选择它是因为它比(二进制)* 绑定得更紧密。但是我无法让它工作。

这样的事情有可能吗?

也许是预处理器的诡计?

【问题讨论】:

  • 我建议您删除所有关于这样做的相对重要性的价值判断,因为它只会引起您的注意,实际上并没有帮助,而且它无助于理解您的问题。跨度>
  • 不应为内置类型重载运算符,但您可以编写包装类并重载 operator^ 或任何您想要的。在我看来,这是不必要的,而且会引起混淆,因为人们习惯于 operator^ 是 XOR。
  • 这是做不到的,因为你不能重载只涉及原始类型的运算符,并且没有可以由预处理器重新定义的标记(你不能将宏命名为数字或 ^ )。
  • @xaxxon 我认为确实如此。我试图解释我“打破规则”的动机,可以这么说,以免有人来提供相当于“你不应该这样做”的建议。
  • 我不明白所有的反对意见。这个问题是合理和有用的。经证明,也很好回答。

标签: c++ operators


【解决方案1】:

这样的?

#include <iostream>
#include <cmath>

using namespace std;

class Exp {
 public:
  double val ;
  Exp(double val) : val(val) {}
  Exp operator^(const Exp &exp) {
      return Exp(pow(val, exp.val));
  }
  operator double () {
    return val;
  }
};

ostream &operator << (ostream &out, const Exp &exp) {
  out << exp.val;
  return out;
}


int main(){
   Exp a = 2;
   Exp b = 3;

   cout << (a + b) << ", " << (a ^ b) << endl;

   return 0;
 }

【讨论】:

  • 这对于做两个Exp 的力量来说很好。但是,如果我想添加它们怎么办?更糟糕的是,如果我想添加 Expdouble 怎么办?我必须手动重新声明所有运算符?
  • 在这种特殊情况下,您也可以将 cast 重载为 double。我将它添加到示例中。
【解决方案2】:

您可以定义自己的用户定义文字,该文字返回一个带有调用运算符的对象以执行求幂,如

5.123_E(3)

这种方法的明显缺点是它只适用于文字值,即没有a_E(b)(尽管5.123_E(b) 可以工作)。

#include <iostream>
#include <cmath>

template < typename T >
class Exponential
{
  T m_base;
public:
  Exponential(T base) : m_base{base} {}
  template < typename R >
  decltype(auto) operator()(R exponent) { return std::pow(m_base,exponent); }
};

Exponential<long double> operator "" _E(long double base) { return Exponential<long double>{base}; }

int main()
{
  std::cout << (5.123_E(3)) << std::endl;
}

【讨论】:

    猜你喜欢
    • 2019-05-13
    • 2016-10-01
    • 2021-10-22
    • 2011-04-06
    • 2020-05-15
    • 2011-01-13
    • 1970-01-01
    • 1970-01-01
    • 2013-10-05
    相关资源
    最近更新 更多