Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/136.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我能用C++编程算数算符吗?_C++_Operators - Fatal编程技术网

我能用C++编程算数算符吗?

我能用C++编程算数算符吗?,c++,operators,C++,Operators,在数值编程中,我经常想在表达式中增加一个数的幂。这会导致出现数百次powx、2或类似的代码 这会使代码变得混乱,使其可读性和解析性降低,尤其是在将编写的公式与代码进行比较时 我想在C++中编写一个算符,如果这是可能的。 a^b == pow(a, b) 我尝试为运算符double、double或运算符[]double、double select编写重载,因为它绑定的比binary*更紧密。但是我不能让它工作 这样的事情有可能吗 也许是预处理器的诡计?类似的事情 #include <ios

在数值编程中,我经常想在表达式中增加一个数的幂。这会导致出现数百次powx、2或类似的代码

这会使代码变得混乱,使其可读性和解析性降低,尤其是在将编写的公式与代码进行比较时

我想在C++中编写一个算符,如果这是可能的。

a^b == pow(a, b)
我尝试为运算符double、double或运算符[]double、double select编写重载,因为它绑定的比binary*更紧密。但是我不能让它工作

这样的事情有可能吗

也许是预处理器的诡计?

类似的事情

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

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

5.123_E(3)
这种方法的明显缺点是,它只适用于文本值,即不使用a_Eb,尽管5.123_Eb可以工作

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

我建议您删除所有关于这样做的相对重要性的价值判断,因为这只会引起您的注意,这实际上没有帮助,也无助于理解您的问题。不应为内置类型重载运算符,但您可以编写包装类和重载运算符^或任何您想要的内容。在我看来,这是不必要的,而且会引起混乱,因为人们习惯于运算符^XOR。这是不可能做到的,因为你不能重载只涉及基元类型的运算符,也没有可以由预处理器重新定义的标记。你不能将宏命名为数字或^。@xaxxon我认为是这样的。可以这么说,我是想解释我违反规则的动机,以免有人来给你提建议,等于你不应该这样做。我不理解所有的反对票。这个问题是合理和有用的。也可以很好的回答,因为已经被证明了。这对于做两个经验的力量是很好的。但是如果我想,比如说,添加它们呢?更糟糕的是,如果我想添加一个Exp和一个double呢?我必须手动重新声明所有运算符?在这种特殊情况下,您也可以将强制转换重载为加倍。我将其添加到示例中。