我可以在C 中编程一个启动操作员吗?

Can I program an exponentiation operator in C++?

本文关键字:一个 启动 操作员 编程 我可以      更新时间:2023-10-16

在数值编程中,我经常想在表达式内提出一个数字。这导致代码具有数百种pow(x,2)或类似的事物。

这会使代码剪辑,并使它不可读取,也不太容易解析,尤其是在将书面方程与代码进行比较时。

我想在C 中写一个用于指示的操作员,如果这是可能的。

a^b == pow(a, b)

我尝试为operator()(double, double)operator[](double, double)编写过载(选择它是因为它比(二进制(*更紧密。但是我不能使它起作用。

是这样的事情吗?

也许预处理程序骗局?

类似的东西?

#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;
 }

您可以定义自己的用户定义的文字,该字面返回了用呼叫操作员返回对象以执行指示,例如

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;
}