我能用C++编程算数算符吗?
在数值编程中,我经常想在表达式中增加一个数的幂。这会导致出现数百次powx、2或类似的代码 这会使代码变得混乱,使其可读性和解析性降低,尤其是在将编写的公式与代码进行比较时我能用C++编程算数算符吗?,c++,operators,C++,Operators,在数值编程中,我经常想在表达式中增加一个数的幂。这会导致出现数百次powx、2或类似的代码 这会使代码变得混乱,使其可读性和解析性降低,尤其是在将编写的公式与代码进行比较时 我想在C++中编写一个算符,如果这是可能的。 a^b == pow(a, b) 我尝试为运算符double、double或运算符[]double、double select编写重载,因为它绑定的比binary*更紧密。但是我不能让它工作 这样的事情有可能吗 也许是预处理器的诡计?类似的事情 #include <ios
我想在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呢?我必须手动重新声明所有运算符?在这种特殊情况下,您也可以将强制转换重载为加倍。我将其添加到示例中。